python - 如何将直方图的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"])
它只将更改应用于第二个图,而将其他图留空。
解决方案
起初,我会对您为什么要操纵 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])
...
推荐阅读
- flutter - 如何将内部 json 部分转换为 dart/flutter 中的对象
- scala - 使用期货的 Scala 程序没有终止
- bash - 在 Pages 文件中的长单词内添加空格的 Bash 脚本
- unity3d - Unity3D:Resource.Load 定义的 AudioClip 最终以 Null 进入 AudioSource
- python - pyserial 线程挂在 serial.in_waiting() 语句上
- python - 叶子地图上的时间序列
- jms - JBoss EAP 7 - 没有standalone-full.xml 的客户端 JMS?
- javascript - 我可以使用 .includes() 来确定数组是否包含基于字符串数组而不是单个字符串的某个元素吗?
- graphql - 如何将共享到 GraphQL Bin 选项添加到我的 Apollo 服务器游乐场?
- .net - 使迭代器函数在抛出异常时返回空引用