如何在Python plot()中减少X轴索引标签数量,避免过于拥挤?
解决pandas plot日期X轴标签过密的问题
针对你用pandas pivot_table生成数据后绘制温度时序图时X轴日期标签过于密集的问题,这里提供几种实用的调整方法:
方法1:控制X轴刻度最大数量
利用matplotlib的MaxNLocator指定X轴最多显示的标签数量,让自动调整更合理:
import pandas as pd import matplotlib.pyplot as plt from matplotlib.ticker import MaxNLocator All_sensor_data = pd.read_csv("C:/Users/USER1/Desktop/Lab/TMP sensor/tot_data_TMP/All_sensor_data.csv") All_sensor_data = All_sensor_data.rename(columns={"Date_n_Time": "datetime"}) # 必须将datetime列转为datetime类型,否则无法识别为日期格式 All_sensor_data['datetime'] = pd.to_datetime(All_sensor_data['datetime']) TMP = All_sensor_data.pivot_table(index="datetime", columns="treatment", values="Temperature (*C)", aggfunc='mean', fill_value=0) # 绘制图表并获取坐标轴对象 ax = TMP["2022-08-07":"2023-01-10"].plot(xlabel="Date", ylabel="Temperature (°C)", title="Temperature vs Date") # 设置X轴最多显示8个标签 ax.xaxis.set_major_locator(MaxNLocator(8)) # 旋转标签避免重叠 plt.xticks(rotation=45) # 自动调整布局防止标签被截断 plt.tight_layout() plt.show()
方法2:按日期间隔设置刻度(适配时序数据)
直接指定按月份/周等固定间隔显示日期标签,比如每月显示一个:
import pandas as pd import matplotlib.pyplot as plt from matplotlib.dates import MonthLocator, DateFormatter All_sensor_data = pd.read_csv("C:/Users/USER1/Desktop/Lab/TMP sensor/tot_data_TMP/All_sensor_data.csv") All_sensor_data['datetime'] = pd.to_datetime(All_sensor_data.rename(columns={"Date_n_Time": "datetime"})['datetime']) TMP = All_sensor_data.pivot_table(index="datetime", columns="treatment", values="Temperature (*C)", aggfunc='mean', fill_value=0) ax = TMP["2022-08-07":"2023-01-10"].plot(xlabel="Date", ylabel="Temperature (°C)", title="Temperature vs Date") # 设置每月显示一个主刻度 ax.xaxis.set_major_locator(MonthLocator()) # 自定义日期显示格式 ax.xaxis.set_major_formatter(DateFormatter('%Y-%m')) plt.xticks(rotation=45) plt.tight_layout() plt.show()
如果需要按周显示,可导入MO(周一)并替换定位器:
from matplotlib.dates import MO, WeekdayLocator ax.xaxis.set_major_locator(WeekdayLocator(byweekday=MO))
方法3:手动指定要显示的日期标签
直接生成固定间隔的日期列表作为X轴刻度:
import pandas as pd import matplotlib.pyplot as plt All_sensor_data = pd.read_csv("C:/Users/USER1/Desktop/Lab/TMP sensor/tot_data_TMP/All_sensor_data.csv") All_sensor_data['datetime'] = pd.to_datetime(All_sensor_data.rename(columns={"Date_n_Time": "datetime"})['datetime']) TMP = All_sensor_data.pivot_table(index="datetime", columns="treatment", values="Temperature (*C)", aggfunc='mean', fill_value=0) subset = TMP["2022-08-07":"2023-01-10"] # 生成间隔为10天的日期标签 xticks = pd.date_range(start=subset.index.min(), end=subset.index.max(), freq='10D') ax = subset.plot(xlabel="Date", ylabel="Temperature (°C)", title="Temperature vs Date", xticks=xticks) plt.xticks(rotation=45) plt.tight_layout() plt.show()
关键注意点
- 必须将
datetime列转为datetime类型,否则pandas和matplotlib无法识别日期格式,刻度调整会失效。 tight_layout()可自动调整图表布局,避免标签被边缘截断。- 旋转标签(如
rotation=45)配合刻度数量调整,能进一步提升可读性。
内容的提问来源于stack exchange,提问作者Jonathan Fireman
相关产品推荐
相关产品推荐

