首页 > 解决方案 > 如何将直方图的y轴值乘以Python中的固定数字

问题描述

我有一个使用直方图绘制的数据列表。我想分别缩放y-axis每个情节。如果我确实喜欢以下内容,它会将每个情节y-axis按 10 倍缩放。

protocols = {}
types = {"data1": "data1.csv", "data2": "data2.csv", "data3": "data3.csv"}

for protname, values in protocols.items():
    fig, ax1 = plt.subplots()
    ax1.hist(values["col_data"], facecolor='blue', alpha=0.9, label=protname,align='left')
    y_vals = ax1.get_yticks()
    ax1.set_yticklabels(['{:3.0f}'.format(x * 10) for x in y_vals])
    plt.legend()
    plt.show()

在此处输入图像描述 在此处输入图像描述 在此处输入图像描述

但是,我希望每个直方图的缩放比例是分开的。我尝试如下,但它似乎没有按预期工作。

for protname, values in protocols.items():
    fig, ax1 = plt.subplots()
    ax1.hist(values["col_data"], facecolor='blue', alpha=0.9, label=protname,align='left')
    y_vals = ax1.get_yticks()
    ax1.set_yticklabels(['{:3.0f}'.format(x * 10) for x in y_vals if protname=="data1" and ['{:3.0f}'.format(x * 10) for x in y_vals if protname=="data2" and ['{:3.0f}'.format(x * 15) for x in y_vals if protname=="data3"]]])

    plt.legend()
    plt.show()

在此处输入图像描述 在此处输入图像描述 在此处输入图像描述

如果我们只尝试一个图,因为ax1.set_yticklabels(['{:3.0f}'.format(x * 10) for x in y_vals if protname=="data2"])它只将更改应用于第二个图,而将其他图留空。

标签: pythonpython-3.xnumpymatplotlibhistogram

解决方案


起初,我会对您为什么要操纵 y 轴值感兴趣,因为直方图值是您的数据的值——我看不出有什么理由在不失去数据意义的情况下更改它。

也就是说,我的下一个问题通常是您是否故意plt.subplots for 循环中设置,因为此命令的一个用例实际上是将多个子图创建到一个图形中-也许您稍后会考虑...

但是,在不同迭代中应用不同因子的最简单方法是将它们作为另一个列表添加到循环中zip

factors = [10, 10, 15]
for (protname, values), m in zip(protocols.items(), factors):
    ...
    ax1.set_yticklabels(['{:3.0f}'.format(x * m) for x in y_vals])
    ...

推荐阅读