hist 画多组数据报颜色数量不符,怎样统一直方图颜色
Matplotlib 3.10.8 的 hist 要求每组数据对应一个颜色,单个 color 与 plot 的行为不同。说明颜色列表、分组方向及 3.11.0 行为。
两组数据用 plot(..., color="k") 可以画成同色,换成 hist(..., color="k") 却报 The 'color' keyword argument must have one color per dataset。在 Matplotlib 3.10.8 中,hist 会把单个颜色解释为一项颜色列表,再检查它的长度是否等于数据组数。
例如输入是 [[0, 1, 2], [3, 4, 5]],直方图路径识别到两组数据,但黑色 "k" 只产生一个颜色,于是拒绝绘制。这是具体参数组合的限制,不代表这两组数据不能画在同一个坐标轴上。
为每一组明确给出相同颜色
需要兼容上述版本,可以把颜色写成与组数对应的列表:
import matplotlib.pyplot as plt
data = [[0, 1, 2], [3, 4, 5]]
fig, ax = plt.subplots()
ax.hist(data, bins=[0, 2, 4, 6], color=["k"] * len(data))
示例的外层列表代表两组,每个内层列表包含该组观测值;颜色列表因此有两项。这里显式给出共用的分箱边界,便于比较两组。真实任务应沿用原先合适的 bins、权重、密度和叠加设置,不要为修颜色顺手改变统计含义。
若 data 是二维 NumPy 数组,hist 按列识别数据组,不能机械地用 len(data) 当组数。先确定每组在哪个轴,再准备对应数量的颜色;否则把报错消掉之后,图中的组仍可能和业务标签错位。
线框直方图可以明确设置边缘颜色
只需要未填充的阶梯轮廓时,也可在原有 histtype="step" 设置下指定 edgecolor="k"。这控制轮廓颜色,不是对所有直方图样式都等价的替换。普通填充柱需要同时考虑面颜色和边颜色,不能只改轮廓后宣称所有柱子已经同色。
同色会削弱组间辨识。若最终仍要区分样本,可以保留标签,并按图表目的使用不同线型、填充或分面。颜色修正不应该把两组数据合并成一组,更不能把一维观测值的数量当作数据组数。
3.11.0 已接受可识别的单个颜色
Matplotlib 3.11.0 的正式 hist 实现会先判断 color 是否是一个合法单色;是单色时按数据组数展开,再执行后续处理。因此在该实现下,前面的单色写法不再因两组数据而触发这一错误。仍需维护 3.10.x 环境时,可保留逐组颜色列表,不必为统一颜色改动整套绘图依赖。
若仍使用颜色列表,列表长度仍应与组数一致。升级后验收需检查每组计数、公共分箱、标签以及实际保存的图,而不只是确认函数不再抛错。若更新后颜色已经正常、计数却不一致,应回到输入方向、权重和 density 设置继续定位。


