如何为每个类别含两列的柱状图设置柱子的最小像素高度?
如何为每个类别含两列的柱状图设置柱子的最小像素高度?
嘿,我之前也碰到过一模一样的问题!当数据波动大的时候,那些小数值的柱子缩得快看不见了,特别闹心。这里给你几个实用的解决思路,分不同常用工具来说,你可以对应自己用的库来调整:
如果你用的是 Matplotlib
核心思路是先把过小的数据值替换成对应最小像素高度的数值,同时在柱子上标注真实值,避免误导。举个实际的代码例子:
import matplotlib.pyplot as plt # 你的原始数据:类别 + 两列数据 categories = ['A', 'B', 'C', 'D'] col1_data = [2, 50, 3, 60] col2_data = [1, 45, 2, 55] # 先算清楚「最小像素高度」对应的数据值: # 假设你的图表高度是400像素,y轴最大值是60,那每1像素对应 60/400 = 0.15 的数据值 # 想要最小5像素高度,对应的数值就是 0.15*5 = 0.75 min_height_val = 0.75 # 处理显示用的数据:把小于最小值的都替换成最小值 col1_display = [max(val, min_height_val) for val in col1_data] col2_display = [max(val, min_height_val) for val in col2_data] x = range(len(categories)) bar_width = 0.35 fig, ax = plt.subplots() # 画两列柱子 rects1 = ax.bar([i - bar_width/2 for i in x], col1_display, bar_width, label='第一列') rects2 = ax.bar([i + bar_width/2 for i in x], col2_display, bar_width, label='第二列') # 在每个柱子上标注真实数据,用户一眼就能看到原始值 for rect, real_val in zip(rects1, col1_data): height = rect.get_height() ax.text(rect.get_x() + rect.get_width()/2., height, f'{real_val}', ha='center', va='bottom') for rect, real_val in zip(rects2, col2_data): height = rect.get_height() ax.text(rect.get_x() + rect.get_width()/2., height, f'{real_val}', ha='center', va='bottom') ax.set_xticks(x) ax.set_xticklabels(categories) ax.legend() plt.show()
这样处理后,哪怕原始数据只有1,柱子也会有明显的高度,同时用户能清楚看到真实数值,完全不会被误导。
如果你用的是 Plotly
Plotly的处理逻辑类似,也是用显示值保证柱子高度,同时通过hover提示或者文本标注展示真实数据:
import plotly.express as px import pandas as pd # 构造你的数据框 df = pd.DataFrame({ '类别': ['A', 'A', 'B', 'B', 'C', 'C', 'D', 'D'], '真实值': [2, 1, 50, 45, 3, 2, 60, 55], '列名': ['列1', '列2']*4 }) # 同样计算最小高度对应的数据值,这里还是用0.75举例 min_height_val = 0.75 # 新增显示用的字段 df['显示值'] = df['真实值'].apply(lambda x: max(x, min_height_val)) # 绘制分组柱状图,hover时显示真实值,柱子上也标注真实值 fig = px.bar(df, x='类别', y='显示值', color='列名', barmode='group', hover_data={'显示值': False, '真实值': True}) fig.update_traces(text=df['真实值'], textposition='outside') fig.show()
通用小提醒
不管用什么工具,有个点一定要注意:绝对不能只修改柱子高度却不标注真实数据,不然会严重误导看图表的人。另外,如果你不想修改数据,也可以考虑用「截断y轴」的方式,但这种方式一定要在图表上明确标注y轴是截断的,不然很容易让人误解数据比例。
备注:内容来源于stack exchange,提问作者coralinecodes
相关产品推荐
相关产品推荐

