Matplotlib绘制混合图表时如何手动设置y轴范围为1400至最大值
解决方法
失效原因
混合绘图场景下y轴手动设置不生效,核心是plt.bar()执行时会触发Matplotlib默认的自动坐标轴缩放逻辑,如果你把plt.ylim()写在柱状图绘制之前,设置的范围会被自动缩放逻辑覆盖。另外计算y轴上限时需要把误差棒的上偏差长度纳入计算,否则误差棒顶端会被画布边缘截断。
修正方案
把y轴范围设置语句放在所有绘图命令执行完成后、plt.show()调用前,手动指定y轴下限为1400,上限取所有y方向绘图元素的最大值(折线数据、柱状图+对应误差棒的最大值)即可。
修正后的完整可运行代码:
import numpy as np import matplotlib.pyplot as plt from matplotlib.ticker import StrMethodFormatter a1 = np.linspace(0.5,3.0,20) d2 = np.array([1357.20029811, 1518.79648166, 1636.42791465, 1720.7907639 , 1779.8196137 , 1819.45852936, 1844.19713989, 1857.45123917, 1861.83690162, 1859.37001519, 1851.61278982, 1839.7821616 , 1824.83057928, 1807.50662414, 1788.40080137, 1767.98035494, 1746.61590397, 1724.6019459 , 1702.17273138, 1679.51462449]) d1 = np.array([0.55,1.16,1.736,2.28]) data2 = np.array([1424.6123596 , 1819.96128591, 1856.87393688, 1797.60859988]) D = np.array([3.342,8.22,15.19,23.70]) fig = plt.figure(figsize = (7, 5)) plt.plot(a1,d2,'--',color='y', label='折线') plt.errorbar(d1,data2, yerr = D,color='g',fmt='o', markersize=5, capsize=5, label='误差棒点') plt.bar(d1, data2, color ='maroon', width = [0.11,0.21,0.33,0.49],alpha = 0.3, label='柱状图') plt.legend(fontsize=14) plt.xticks(fontsize=14) plt.yticks(fontsize=14) # 计算y轴上限:取折线最大值、柱状图+误差最大值,额外加20的边距避免元素贴顶 y_max = max(d2.max(), (data2 + D).max()) + 20 # 所有绘图完成后设置y轴范围,不会被自动缩放逻辑覆盖 plt.ylim(bottom=1400, top=y_max) plt.show()
注意点
- 原数据中折线
d2的第一个点数值为1357.2,小于设置的y轴起点1400,设置范围后该点会被截断,属于预期效果 - 代码里给三个绘图元素都补了
label参数,避免调用plt.legend()时出现无图例项的警告
内容的提问来源于stack exchange,提问作者CB Vaswar Dash
相关产品推荐
相关产品推荐

