seaborn relplot 时出现 AttributeError: ‘int‘ object has no attribute ‘view‘ 错误原因

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)

猜你喜欢

转载自blog.csdn.net/weixin_44022515/article/details/108735425