如何让Matplotlib指定的Y轴刻度按比例分布?
解决Matplotlib中Y轴刻度按比例分布的问题
你的Y轴数值跨度极大(从3到2400),直接用线性轴会导致小刻度密集堆积在底部,无法按比例展示指定的刻度列表。可以通过以下两种方法解决:
方法一:使用对数Y轴
对数轴适合数值呈倍数增长的场景,能让不同量级的刻度按比例分布:
import matplotlib.pyplot as plt from datetime import datetime x_axis = [datetime.strptime(date, "%d/%m/%y").date() for date in ['06/03/23', '13/03/23']] y1 = [2400, 1900] y2 = [1800, 1800] y3 = [4, 3] plt.plot(x_axis, y1, label="1") plt.plot(x_axis, y2, label="2") plt.plot(x_axis, y3, label="3") plt.gcf().autofmt_xdate() plt.xticks(x_axis) # 启用对数Y轴 plt.yscale('log') # 设置指定的刻度列表 yticks_list = [5,10,15,20,50,100,500,1000,1500,2000,2500] # 显式设置刻度标签,确保显示指定数值 plt.yticks(yticks_list, labels=[str(tick) for tick in yticks_list]) # 添加网格辅助读数 plt.grid(axis='y', linestyle='--', alpha=0.7) plt.legend() plt.show()
方法二:使用Symlog刻度(兼顾小数值与大数值)
如果需要在小数值区域保持线性展示,大数值区域用对数,可以用symlog刻度:
import matplotlib.pyplot as plt from datetime import datetime x_axis = [datetime.strptime(date, "%d/%m/%y").date() for date in ['06/03/23', '13/03/23']] y1 = [2400, 1900] y2 = [1800, 1800] y3 = [4, 3] plt.plot(x_axis, y1, label="1") plt.plot(x_axis, y2, label="2") plt.plot(x_axis, y3, label="3") plt.gcf().autofmt_xdate() plt.xticks(x_axis) # 启用symlog刻度,linthresh设置线性区域阈值(小于10的部分线性展示) plt.yscale('symlog', linthresh=10) yticks_list = [5,10,15,20,50,100,500,1000,1500,2000,2500] plt.yticks(yticks_list, labels=[str(tick) for tick in yticks_list]) plt.grid(axis='y', linestyle='--', alpha=0.7) plt.legend() plt.show()
两种方法都能让你指定的刻度列表按比例分布在Y轴上,解决原图表中刻度堆积的问题。
内容的提问来源于stack exchange,提问作者bbasaran
相关产品推荐
相关产品推荐

