如何用Matplotlib绘制随Y值切换颜色的连续温度折线图?
实现按温度阈值切换颜色的连续折线图
核心思路是将数据拆分为高于0℃和≤0℃的连续分段,同时保留相邻分段的端点,确保折线衔接无断点。matplotlib的plt.plot不支持直接传入布尔数组作为颜色参数,所以必须通过分段绘制解决。
具体实现步骤(基于NumPy+Matplotlib)
- 导入依赖库
import matplotlib.pyplot as plt import numpy as np
- 准备数据(替换为你的真实数据集)
# 模拟1000天的日期与温度数据 dates = np.arange('2020-01-01', '2022-09-27', dtype='datetime64[D]') temps = np.random.normal(0, 5, size=len(dates)) # 均值0℃、标准差5℃的模拟数据
- 定位温度跨越0℃的分界点
# 找出温度符号变化的位置(从正变负或负变正) cross_indices = np.where(np.diff(np.sign(temps)) != 0)[0] + 1 # 生成分段索引区间:起始点→所有分界点→结束点 split_indices = np.concatenate([[0], cross_indices, [len(temps)]])
- 分段绘制折线
plt.figure(figsize=(12, 6)) for i in range(len(split_indices)-1): start_idx = split_indices[i] end_idx = split_indices[i+1] # 判断当前分段的温度属性(取分段第一个点即可,连续段温度符号一致) line_color = 'red' if temps[start_idx] > 0 else 'blue' plt.plot(dates[start_idx:end_idx], temps[start_idx:end_idx], color=line_color, linewidth=2) # 添加辅助元素 plt.xlabel('日期') plt.ylabel('温度 (℃)') plt.title('每日温度变化(>0℃为红色,≤0℃为蓝色)') plt.axhline(y=0, color='gray', linestyle='--', linewidth=1) # 0℃参考线 plt.xticks(rotation=45) plt.tight_layout() plt.show()
如果你用Pandas处理数据
import pandas as pd # 转换为DataFrame(替换为你的真实数据结构) df = pd.DataFrame({'date': dates, 'temp': temps}) # 标记温度符号变化的位置 df['temp_sign'] = np.sign(df['temp']) cross_mask = df['temp_sign'].ne(df['temp_sign'].shift()) cross_indices = df[cross_mask].index.tolist() split_indices = [0] + cross_indices + [len(df)] plt.figure(figsize=(12, 6)) for s_idx, e_idx in zip(split_indices[:-1], split_indices[1:]): segment = df.iloc[s_idx:e_idx] line_color = 'red' if segment['temp'].iloc[0] > 0 else 'blue' plt.plot(segment['date'], segment['temp'], color=line_color, linewidth=2) # 辅助元素设置同上 plt.xlabel('日期') plt.ylabel('温度 (℃)') plt.title('每日温度变化(>0℃为红色,≤0℃为蓝色)') plt.axhline(y=0, color='gray', linestyle='--', linewidth=1) plt.xticks(rotation=45) plt.tight_layout() plt.show()
为什么你之前的方法失效?
- 散点图仅绘制离散点,无法形成连续折线;
- 直接分段绘制若未保留分界端点,会导致相邻折线断开;
plt.plot不支持布尔数组作为颜色参数,因此传入时会触发ValueError;- 单独绘制两条折线(分别取>0和≤0的点)会因非连续数据导致折线跳跃、出现断点。
内容的提问来源于stack exchange,提问作者user1
相关产品推荐
相关产品推荐

