Python绘图:如何优化Datetime横轴并设置末位刻度加粗?
解决双Y轴图横轴Datetime拥挤及最后刻度加粗问题
核心思路
针对850条数据的Datetime横轴拥挤问题,通过控制刻度密度、优化标签显示解决,再通过定位最后一个刻度对象实现加粗效果。以下是完整可运行的代码方案:
步骤1:数据预处理与基础绘图
先确保Datetime列是datetime类型,再初始化双Y轴画布:
import pandas as pd import matplotlib.pyplot as plt import matplotlib.dates as mdates # 转换Datetime列为datetime类型(假设你的DataFrame名为df) df['Datetime'] = pd.to_datetime(df['Datetime']) # 创建画布与第一个Y轴 fig, ax1 = plt.subplots(figsize=(12, 6)) # 绘制Cloud Coverage曲线 ax1.plot(df['Datetime'], df['Cloud Coverage'], color='tab:blue', label='Cloud Coverage') ax1.set_xlabel('Datetime') ax1.set_ylabel('Cloud Coverage', color='tab:blue') ax1.tick_params(axis='y', labelcolor='tab:blue') # 创建双Y轴并绘制Cloud type曲线 ax2 = ax1.twinx() ax2.plot(df['Datetime'], df['Cloud type'], color='tab:orange', label='Cloud type') ax2.set_ylabel('Cloud type', color='tab:orange') ax2.tick_params(axis='y', labelcolor='tab:orange') # 合并两组图例 lines1, labels1 = ax1.get_legend_handles_labels() lines2, labels2 = ax2.get_legend_handles_labels() ax1.legend(lines1 + lines2, labels1 + labels2, loc='upper right')
步骤2:优化横轴刻度(解决黑块/拥挤)
提供两种适配不同时间分布的方案,选其一即可:
方案A:按时间间隔设置刻度(适配规律时间序列)
用时间定位器自动控制刻度密度,比如每4小时显示一个刻度:
# 设置横轴主刻度为每4小时一个 ax1.xaxis.set_major_locator(mdates.HourLocator(interval=4)) # 设置刻度显示格式(可根据需求调整,比如只显示日期+小时) ax1.xaxis.set_major_formatter(mdates.DateFormatter('%Y-%m-%d %H'))
方案B:按数据采样间隔设置刻度(适配无规律时间序列)
直接按数据索引采样,比如每50条数据显示一个刻度:
# 每隔50条数据取一个Datetime作为刻度 tick_indices = range(0, len(df), 50) tick_dates = df['Datetime'].iloc[tick_indices] ax1.set_xticks(tick_dates) # 设置刻度标签格式并旋转,避免重叠 ax1.set_xticklabels(tick_dates.dt.strftime('%Y-%m-%d %H'), rotation=45, ha='right')
步骤3:将最后一个Datetime刻度设为加粗
获取横轴刻度标签对象,修改最后一个的字体权重:
# 获取所有横轴刻度标签 xtick_labels = ax1.get_xticklabels() # 把最后一个标签设置为加粗 if xtick_labels: xtick_labels[-1].set_weight('bold')
最后调整布局并显示
plt.tight_layout() plt.show()
额外注意事项
- 若时间跨度较大(比如跨多天),可改用
mdates.DayLocator()设置按天显示刻度。 - 若仍有标签重叠,可进一步调大画布尺寸(比如
figsize=(15,6))或增加采样间隔。
内容的提问来源于stack exchange,提问作者user21521800
相关产品推荐
相关产品推荐

