使用seaborn绘制分组柱状图仅显示yes分类无no数据问题求助
问题原因分析
- melt函数参数与调用对象错误:你定义的
df是Python字典,没有melt方法,且存储yes/no分组的列名为DD,原代码误写为不存在的D,导致yes/no分组信息完全丢失,所以只能看到一半数据。 - 列名大小写不匹配:存储类别信息的列在DataFrame中为大写的
M,原代码在catplot的x参数中写为小写的'm',导致x轴取值错误。 - 展示逻辑错误:原代码没有将DD(yes/no)作为分组维度纳入绘图逻辑,仅手动修改前几行x轴标签,自然无法展示no对应的数据。
修正方案
如果需要每个M类别下同时展示yes/no两组数据,可以选择将DD设为行分组,或者设为第二个hue参数实现同x轴位置并排展示,修正后完整代码如下:
import pandas as pd import seaborn as sns import matplotlib.pyplot as plt # 原始数据定义 f = [0.31,0.75,0.75,0.75, 0.66,0.83,0.57, 0.69, 0.64,0.61, 0.81,0.21,0.71,0.71,0.64,0.55,0.72,0.74,0.73,0.77] p = [0.53, 0.72,0.73,0.70,0.44,0.38,0.68,0.79,0.60,0.76, 0.76,0.32,0.84,0.79,0.80,0.38,0.77,0.86,0.81,0.79] r = [0.74,0.54,0.63,0.61,0.41,0.83,0.63,0.67,0.63,0.53, 0.86,0.51,0.21,0.68,0.59,0.98,0.78,0.75,0.71,0.67] a = [0.92,0.93,0.92,0.92,0.94,0.82,0.97,0.94,0.91,0.93, 0.97,0.91,0.94,0.93,0.94,0.71,0.93,0.91,0.85,0.94] pp=['B','B','B','B','B','T','T','T','T','T','B','B','B','B','B','T','T','T','T','T'] m=['N','L','S','G','Rt','N','L','S','G','Rt','N','L','S','G','Rt','N','L','S','G','Rt'] d=['yes','yes','yes','yes','yes','yes','yes','yes','yes','yes','no','no','no','no','no','no','no','no','no','no'] df_dict = {'DD':d, 'PP': pp, 'M': m, 'P': p, 'R':r, 'F':f,'A':a} df = pd.DataFrame(data=df_dict) # 修正melt参数,保留DD分组字段 df_melt = df.melt(id_vars=['PP', 'M', 'DD'], value_vars=['P','R','F','A'], var_name='variable', value_name='value') sns.set_style(style='white') g = sns.catplot( data=df_melt, x='M', # 修正为大写列名 y='value', hue='PP', col='variable', col_wrap=2, col_order = ['P', 'R', 'F', 'A'], kind='bar', ci=None, # 按DD(yes/no)分行展示,若需要同x轴并排可改为hue='DD' row='DD', facet_kws={'sharey': False, 'sharex': True}, height=4. ) plt.show()
如果需要yes和no的柱子在同一个x轴位置并排展示,只需要删掉row='DD'参数,改为给hue传入列表hue=['PP', 'DD']即可。
内容的提问来源于stack exchange,提问作者Math
相关产品推荐
相关产品推荐

