如何按轴1分组绘制箱线图?基于DataFrame行的箱线图实现求助
解决方案:按每行(Meter)绘制箱线图
你现在的代码是按列(每个availability指标)来绘制箱线图的,要实现按每行(每个meter)展示三个availability值的分布,只需要调整数据融合的方式,同时保留meter的标识即可,完全不需要修改原DataFrame结构。
以下是修正后的可运行代码:
import pandas as pd import matplotlib.pyplot as plt import seaborn as sns # Windows路径建议用原始字符串避免转义问题 file = r'D:\test_box_plot.csv' # 读取数据时保留meters列(作为每个meter的唯一标识)和三个availability列 df = pd.read_csv(file, sep=";", usecols=['meters', 'availability1','availability2','availability3']) # 融合数据:以meters为分组基准,将三个availability列转为统一的数值列 melted_df = pd.melt(df, id_vars='meters', var_name='availability_type', value_name='availability_value') # 绘制箱线图:x轴对应meter数值,y轴对应availability的取值 sns.boxplot(x='meters', y='availability_value', data=melted_df) plt.xlabel('Meter') plt.ylabel('Availability') plt.title('Availability Distribution per Meter') plt.show()
关键调整说明:
- 保留分组标识:读取数据时加入
meters列,确保我们能区分每个数据点属于哪个meter。 - 定向融合数据:
pd.melt的id_vars参数指定meters作为分组依据,这样每个meter会对应3行数据(分别对应三个availability指标),刚好适配箱线图按分组展示分布的需求。 - 适配箱线图逻辑:x轴设为
meters,y轴设为融合后的availability_value,这样x轴的每个刻度(0、50、100等)就对应一个meter的箱线图,直观展示该行三个availability值的范围、中位数等统计信息。
如果你更倾向用id列作为meter的标识,只需要把usecols里的meters换成id,再同步修改melt和boxplot中的参数即可。
内容的提问来源于stack exchange,提问作者Kateryna Lubyk - Slava Ukraini
相关产品推荐
相关产品推荐

