Matplotlib循环绘制折线图:颜色过渡失效问题排查
问题原因及解决方案
问题出在颜色渐变的计算分母上:
- 你循环的是国家列表(
index.levels[0]),但计算颜色时用了整个DataFrame的行数(len(df_MBPS_GT100_groupy_land_jahr_mean))作为分母。 - 你的DataFrame有288行,而国家数量应该远小于288,所以
i / (288-1)的结果会非常接近0,对应的red值几乎为0,blue值几乎为1,所有线条自然都呈现接近蓝色的状态。
修改方案
把颜色计算的分母换成国家的总数,也就是len(df_MBPS_GT100_groupy_land_jahr_mean.index.levels[0]),这样i的范围和分母匹配,才能生成从蓝到红的完整渐变:
import matplotlib.pyplot as plt import numpy as np import pandas as pd fig, ax = plt.subplots(nrows=1, ncols=2, figsize=(30, 10)) country_list = df_MBPS_GT100_groupy_land_jahr_mean.index.levels[0] total_countries = len(country_list) i = 0 for country in country_list: # 用国家总数作为分母计算渐变,同时避免单国家时分母为0 red = i / (total_countries - 1) if total_countries > 1 else 0 green = 0 blue = 1 - red color = (red, green, blue) # 简化数据提取逻辑 country_data = df_MBPS_GT100_groupy_land_jahr_mean.loc[country] ax[0].plot(country_data.index, country_data['percentage'], label=country, color=color, lw=2) i += 1 # 后续轴标注等代码
额外优化点:
- 提前提取国家列表并计算总数,避免重复调用
index.levels[0] - 增加
total_countries > 1的判断,避免单国家场景下的分母为0报错 - 简化数据提取代码,让逻辑更清晰
内容的提问来源于stack exchange,提问作者user20693776
相关产品推荐
相关产品推荐

