Seaborn小提琴图使用数组 - 错误提示:`x`和`y`变量似乎都不是数字

4

我正在尝试使用seaborn在同一张图中生成多个小提琴图。我使用的数据框中,一个列中包含多个分类值(用于X轴),每个分类值有一个数组(用于创建该分类值对应的小提琴图)。以下是一个可用的工作示例:

foo = pd.DataFrame(columns =['Names','Values'])
for i in range(10):
    foo.loc[i] = ['no'+str(i),np.random.normal(i,2,10)]

但是当尝试执行该操作时

sns.violinplot(x='Names', y='Values', data=foo)

我得到以下错误:
ValueError:似乎没有数字变量x或y。
现在我可以通过将数组分解成几行来达到目的:
foo = pd.DataFrame(columns =['Names','Values'])
for i in range(3):
    bar = np.random.normal(i,2,10)
    for j,b in enumerate(bar):
        foo.loc[i*10+j] = ['no'+str(i),b]

它会生成我想要的图形:

enter image description here

但我猜想,有一种更简单的解决方案,不需要重新组织我的数据框。

2个回答

3

pd.DataFrame.explode()可以帮助您将列表列转换为单独的单元格。在将它们从字符串转换为实际数字后,sns.violinplot可以轻松绘制。

foo = foo.explode('Values')
foo['Values'] = foo['Values'].astype('float')
sns.violinplot(data=foo, x='Names', y='Values')

enter image description here


2
在Pandas 0.25中,您可以使用explode方法;如果是之前的版本,则可以使用这里的任何解决方案。
result = foo.explode('Values').reset_index(drop=True)
result = result.assign(Names=result['Names'].astype('category'), 
                       Values=result['Values'].astype(np.float32))

sns_plot = sns.violinplot(x='Names', y='Values', data=result)

输出 分类数据的小提琴图

爆炸(或展开)将把您的数据转换为:

   Names     Values
0    no0   3.352148
1    no0   2.195788
2    no0   1.234673
3    no0   0.084360
4    no0   1.778226
..   ...        ...
95   no9  12.385434
96   no9   9.849669
97   no9  11.360196
98   no9   8.535900
99   no9   9.369197

[100 rows x 2 columns]

assign函数将数据类型转换为:

Names     category
Values     float32
dtype: object

我的数据已经是“爆炸后”格式。我的值是以HH:mm格式表示的时间。 https://dev59.com/m1QK5IYBdhLWcg3wMNEV 这适用于散点图,但不适用于小提琴图。 - Unknow0059

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接