在熊猫中,如何将数值类型转换为类别类型以与seaborn色相配合使用

时间:2020-02-17 23:07:59

标签: python pandas seaborn

我陷入了一个似乎很容易解决的问题,即尝试为正在创建的散点图上的不同组着色。我有以下示例数据框和图形:

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)

创建此图:

enter image description here 但是,我希望对3个类别[2、3、4]中的每一个类别都使用分类量表,而不是连续量表。在取消注释代码行test_df['D'] = ...并将该列更改为category列类型以在seaborn图中进行类别着色之后,我从seaborn图中收到以下错误:TypeError: data type not understood

有人知道将数字列转换为要用于着色的因子/分类列的正确方法吗?

谢谢!

2 个答案:

答案 0 :(得分:2)

我复制/粘贴了您的代码,添加了要导入的库,并删除了我认为看起来不错的注释。我得到了一个带有“分类”着色的值[2,3,4]的图,而没有更改您的任何代码。

尝试使用pip install --upgrade seaborn

更新您的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”列中的唯一值。