我有一个要使用直方图绘制的数据列表。我想分别缩放每个图的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"])
,则只会将更改应用于第二个地块,而将其他地块保留为空白。
答案 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])
...