如何在Python中将直方图的y轴值乘以固定数

时间:2019-02-21 11:44:43

标签: python python-3.x numpy matplotlib histogram

我有一个要使用直方图绘制的数据列表。我想分别缩放每个图的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()

enter image description here enter image description here enter image description here

但是,我希望每个直方图的缩放比例都分开。我按照以下方法尝试过,但似乎无法按预期工作。

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()

enter image description here enter image description here enter image description here

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

1 个答案:

答案 0 :(得分:1)

起初,我会对您为什么要操纵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])
    ...