seaborn 是python中一个封装的包,可以很方便的做出多种图,而不需要想matplotlib中设置各种参数。我的数据结构如下:
>>> data_1st.head()
其中sample_time 是分类变量,采样的天数。
尝试用sns.relplot 做出点图,不同的sample_type 用不同形状的点,不同sample_time的样本用不同颜色
>>> data_str=data_1st.copy()
>>> sns.relplot(x="E_1st",y="leader_1st",style="sample_type",hue="sample_time",data=data_str[data_str.leader_1st>0])
结果发现sns把sample_time 当成连续变量,用颜色深浅去映射了数值大小。
查看下数据的类型,发现果然是连续变量
>>> data_str.dtypes
name object
sample_type object
sample_time object
E_copy float64
E_ct float64
N_ct float64
R_ct float64
E_1st float64
leader_1st float64
actin_1st float64
E_pure float64
dtype: object
尝试将连续变量换成分类变量,然后作图
#散点图
>>> data_str=data_1st.copy()
>>> data_str.sample_time = data_str.sample_time.astype("object") # 或者object换成 'str'
>>> sns.relplot(x="E_1st",y="leader_1st",style="sample_type",hue="sample_time",data=data_str[data_str.leader_1st>0])
报错: “AttributeError: ‘int’ object has no attribute ‘view’”
AttributeError Traceback (most recent call last)
<ipython-input-363-f9d158258d16> in <module>
3 data_str.sample_time = data_str.sample_time.astype("object")
4 #data_str.sample_time = pd.Categorical(data_str.sample_time)
----> 5
.....................
......
999 A = np.asanyarray(A)
1000 if self.vmin is None and A.size:
-> 1001 self.vmin = A.min()
1002 if self.vmax is None and A.size:
1003 self.vmax = A.max()
C:\conda\lib\site-packages\numpy\ma\core.py in min(self, axis, out, fill_value, keepdims)
5600 if out is None:
5601 result = self.filled(fill_value).min(
-> 5602 axis=axis, out=out, **kwargs).view(type(self))
5603 if result.ndim:
5604 # Set the mask
AttributeError: 'int' object has no attribute 'view'
原来hue参数可以设分类变量(字符型,如‘one’,‘two’,‘three’),但不能是数字型字符(‘1’,‘2’,‘3’)
根据stackflow上的一个解决方案,使用pd.Categorical 函数 尝试将sample_time换成分类型变量
#散点图
>>> data_str=data_1st.copy()
>>> data_str.sample_time = pd.Categorical(data_str.sample_time)
>>> sns.relplot(x="E_1st",y="leader_1st",style="sample_type",hue="sample_time",data=data_str[data_str.leader_1st>0])
发生错误“TypeError: data type not understood”
解决方案1
使用legend=“full” 参数定义legend的数目
#散点图
>>> data_str=data_1st.copy()
>>> sns.relplot(x="E_1st",y="leader_1st",style="sample_type",legend="full",hue="sample_time",data=data_str[data_str.leader_1st>0])
可以看出legend已经是分类而不是连续变量了。但依然是颜色颜色。我们可以自己设置调色板:
#散点图
>>> data_str=data_1st.copy()
>>> sns.relplot(x="E_1st",y="leader_1st",style="sample_type",palette=["red","black","blue","green"],legend="full",hue="sample_time",data=data_str[data_str.leader_1st>0])
这样我们就通过不同颜色区分了分类变量。
方法二,采用调色板颜色映射(推荐用法)
指定hue时,hue会根据分类变量的数目值指定颜色的种类,因此,我们可以自己根据变量的数据去定义调色板颜色数目然后用在自己的变量中即可。
>>> data_str=data_1st.copy()
>>> sns.relplot(x="E_1st",y="leader_1st",hue="sample_time", palette=sns.color_palette("Set1", data_str.sample_time.nunique()),data=data_str)
data_str.sample_time.nunique()
指定变量的数目
>>> data_str.sample_time.nunique()
5
>>> data_str.sample_time.unique()
array([ 1, 5, 10, 14, 21], dtype=int64)