我陷入了一个似乎很容易解决的问题,即尝试为正在创建的散点图上的不同组着色。我有以下示例数据框和图形:
test_df = pd.DataFrame({ 'A' : 1.,
'B' : np.array([1, 5, 9, 7, 3], dtype='int32'),
'C' : np.array([6, 7, 8, 9, 3], dtype='int32'),
'D' : np.array([2, 2, 3, 4, 4], dtype='int32'),
'E' : pd.Categorical(["test","train","test","train","train"]),
'F' : 'foo' })
# fix to category
# test_df['D'] = test_df["D"].astype('category')
# and test plot
f, ax = plt.subplots(figsize=(6,6))
ax = sns.scatterplot(x="B", y="C", hue="D", s=100,
data=test_df)
创建此图:
但是,我希望对3个类别[2、3、4]中的每一个类别都使用分类量表,而不是连续量表。在取消注释代码行test_df['D'] = ...
并将该列更改为category列类型以在seaborn图中进行类别着色之后,我从seaborn图中收到以下错误:TypeError: data type not understood
有人知道将数字列转换为要用于着色的因子/分类列的正确方法吗?
谢谢!
答案 0 :(得分:2)
我复制/粘贴了您的代码,添加了要导入的库,并删除了我认为看起来不错的注释。我得到了一个带有“分类”着色的值[2,3,4]的图,而没有更改您的任何代码。
尝试使用pip install --upgrade seaborn
这是与代码一起使用的工作库的列表。
matplotlib==3.1.2
numpy==1.18.1
seaborn==0.10.0
pandas==0.25.3
...在下面的代码中执行。
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
test_df = pd.DataFrame({ 'A' : 1.,
'B' : np.array([1, 5, 9, 7, 3], dtype='int32'),
'C' : np.array([6, 7, 8, 9, 3], dtype='int32'),
'D' : np.array([2, 2, 3, 4, 4], dtype='int32'),
'E' : pd.Categorical(["test","train","test","train","train"]),
'F' : 'foo' })
# fix to category
test_df['D'] = test_df["D"].astype('category')
# and test plot
f, ax = plt.subplots(figsize=(6,6))
ax = sns.scatterplot(x="B", y="C", hue="D", s=100,
data=test_df)
plt.show()
答案 1 :(得分:1)
我遇到了同样的错误TypeError: data type not understood
。
可行的解决方法是使用选项legend="full"
。在这种方法中,无需转换为分类类型:
ax = sns.scatterplot(x="B", y="C", hue="D", s=100, legend="full", data=test_df)
另一种解决方案是使用自定义调色板:
ax = sns.scatterplot(x="B", y="C", hue="D", s=100, palette=["b", "g", "r"], data=test_df)
在这种情况下,颜色数必须等于“ D”列中的唯一值。