我正在做一些EDA,我观察到Seaborn的以下行为。
海运版本:0.12.2
Matplotlib版本:3.7.1
输入数据
import pandas as pd
import seaborn as sns
data = {'Class': [0, 1, 1, 1, 1, 0, 1, 0, 1],
'count': [509, 61, 18, 29, 8, 148, 54, 361, 46],
'greek_char': ['Alpha', 'Alpha', 'Alpha', 'Alpha', 'Beta', 'Beta', 'Beta', 'Beta', 'Beta'],
'value': ['A', 'B', 'D', 'G', 'A', 'B', 'B', 'C', 'C']}
df = pd.DataFrame(data)
编码
fig = sns.FacetGrid(data=df, col="greek_char", hue="Class")
\_ = fig.map_dataframe(sns.barplot, x="value", y="count", dodge=True)
我得到了以下图表:
以下是一些不一致之处:
- 请注意,Alpha在数据集中没有C,但它出现在图表中。
- Alpha A只有Class 0,但是,我在图中看到了两个类。
- 图中缺少G类和D类。
我将感谢任何帮助,以确定此行为是否是一个错误,预期的行为,或者如果我错过了什么。
2条答案
按热度按时间owfi6suc1#
seaborn.FacetGrid
:警告:在大多数情况下,最好使用图形级函数(例如
relplot()
或catplot()
),而不是直接使用FacetGrid
。FacetGrid
。catplot
正确绘图解决了数据未在正确的'value'
中绘图的问题。'Beta'
→'value': B & C
具有重叠的'Class'
数据,这意味着条形图是分层的,而不是堆叠的。分层条形图是一种非标准的数据表示方式,很可能会被误解。seaborn.barplot
不做堆叠条。1.应避开这些条。- 这是最好的选择
sns.displot
与kind='hist'
可以堆叠条。histplot
的方法,可能会有不可预见的行为,例如为'Beta'
包含额外的x轴位置。'value'
重新标记。df.reset_index(names=['x-axis'], inplace=True)
将生成一组唯一的值,以在x轴上绘制。1.设置
'value'
在x轴上的顺序可以通过以下方式完成:df.sort_values(['greek_char', 'value'], inplace=True)
:pd.DataFrame.sort_values
1.或者,也可以使用
pd.Categorical
,但这会强制所有'value'
类别都位于两个x轴上。1.* * 在
python 3.11.3
、pandas 2.0.2
、matplotlib 3.7.1
、seaborn 0.12.2
中测试**1.
dodge=True
2.
histplot
3.
dodge=False
唯一标签pandas.DataFrame.plot
和kind='bar'
以及stacked=True
是绘制堆叠条形图的最佳选择,因为API专门为实现它们而设计。df
1qczuiv02#
如果您尝试使用
fig.map
而不是fig.map_dataframe
运行代码,您将得到警告UserWarning: Using the barplot function without specifying 'order' is likely to produce an incorrect plot.
一旦我添加了order
参数,我就得到了正确的图。