如何根据绘制值颜色修改Matplotlib时间轴刻度标签颜色?
实现x轴刻度标签颜色与对应数据点颜色匹配
数据示例
DATE TMAX QUANTILE_TMAX_90 QUANTILE_TMAX_95 QUANTILE_TMAX_99 50415 2019-01-01 19.2 19.5 20.2 21.8 50416 2019-01-02 17.4 19.5 20.2 21.8 50417 2019-01-03 17.2 19.5 20.2 21.8 50418 2019-01-04 16.4 19.5 20.2 21.8 50419 2019-01-05 17.4 19.5 20.2 21.8 ... ... ... ... ... 50500 2019-03-27 16.2 19.0 19.8 21.4 50501 2019-03-28 13.6 19.0 19.8 21.4 50502 2019-03-29 15.2 19.0 19.8 21.4 50503 2019-03-30 16.2 19.0 19.8 21.4 50504 2019-03-31 18.8 19.0 19.8 21.4 [90 rows x 5 columns]
原问题分析
已实现按规则为数据点和连线着色:
- TMAX > QUANTILE_TMAX_99:红色
- TMAX > QUANTILE_TMAX_95:橙色
- TMAX > QUANTILE_TMAX_90:黄色
- 其余:黑色
但修改x轴刻度标签颜色时失败,原因有两点:
- 未对
axis_colors赋值,导致列表为空 - Matplotlib默认自动筛选x轴刻度,并非每个日期都显示,刻度标签与数据点无法直接一一对应
解决方案
完整修改代码
import pandas as pd import matplotlib.pyplot as plt import matplotlib.dates as mdates from matplotlib.dates import DateFormatter # 生成每个数据点对应的颜色列表 colors = [] for tmax, p90, p95, p99 in zip(datos['TMAX'], datos['QUANTILE_TMAX_90'], datos['QUANTILE_TMAX_95'], datos['QUANTILE_TMAX_99']): if tmax > p99: colors.append('red') elif tmax > p95: colors.append('orange') elif tmax > p90: colors.append('yellow') else: colors.append('black') fig = plt.figure('Gráfica', figsize=(20,15), dpi=150) ax = fig.add_axes([0.2, 0.25, 0.60, 0.60]) # 绘制彩色数据点(非黑色) for date, tmax, color in zip(datos['DATE'], datos['TMAX'], colors): if color != 'black': ax.plot(date, tmax, color=color, marker='o') # 绘制相邻数据点的连线 for i in range(len(datos)-1): ax.plot(datos['DATE'].iloc[i:i+2], datos['TMAX'].iloc[i:i+2], color=colors[i], linewidth=1) # 强制x轴显示所有日期刻度,确保与数据点一一对应 ax.set_xticks(datos['DATE']) # 旋转刻度标签避免重叠 plt.xticks(rotation=90) # 为每个x轴刻度标签设置对应颜色 for tick_label, color in zip(ax.xaxis.get_ticklabels(), colors): tick_label.set_color(color) # 可选:设置日期格式,优化标签可读性 date_form = DateFormatter("%Y-%m-%d") ax.xaxis.set_major_formatter(date_form) plt.show()
关键说明
ax.set_xticks(datos['DATE']):强制x轴显示所有日期,让每个刻度对应一个数据点,解决了刻度与数据不匹配的问题- 直接遍历刻度标签与
colors列表:此时两者数量一致,可直接一一对应设置颜色 - 如果不需要显示全量日期刻度,可通过
mdates设置自定义间隔,再通过日期匹配找到对应颜色(90天数据显示全刻度更直观)
内容的提问来源于stack exchange,提问作者Javier
相关产品推荐
相关产品推荐

