按月份为散点图数据点着色的实现问题求助
按月份为散点图数据点着色的实现问题求助
我现在遇到了个小麻烦,想给小时粒度的时序数据散点图按月份分色,结果运行自己写的代码后直接报错了,恳请大家帮忙看看问题出在哪!
我的需求是这样的:我有一个包含日期列和数值列的DataFrame,日期跨度从2015到2024,数据是每小时一条的,条目特别多。我想用散点图展示这些数据,并且让每个数据点根据所属的月份显示不同的颜色——比如不管哪一年,1月的数据都标红,2月的数据标成中紫罗兰色,以此类推每个月份对应专属颜色。
我自己尝试写了下面的代码:
import pandas as pd import numpy as np import matplotlib.pyplot as plt import datetime as dt start_date = '2014-01-01' end_date = '2016-02-01' data_range = pd.date_range(start=start_date, end=end_date, freq ='H') values = np.random.randint(-100,101, size = len(data_range)) df = pd.DataFrame({'date': data_range,'Preis [€/MWh]': values}) df['month'] = df['date'].dt.month df['month_name'] = df['date'].dt.month_name(locale='German') colors = {'Januar': 'red','Februar': 'mediumvioletred', 'März': 'darkviolet', 'April': 'blueviolet','Mai': 'blue','Juni': 'cadeblue', 'Juli': 'green', 'August':'greenyellow', 'September': 'yellow', 'Oktober': 'gold', 'November': 'orange', 'Dezember': 'coral'} df['colors'] = df['month_name'].map(colors) plt.scatter(df['date'], df['Preis [€/MWh]'], color = df['colors'])
结果运行这段代码的时候直接报错了,完全搞不清哪里出问题了,有没有大佬能指点一下怎么修复呀?提前谢谢大家了!
补充修正方案(供参考)
我后来自己排查了下,发现是颜色字典里的拼写错误导致的:Juni对应的cadeblue是错的,正确的Matplotlib颜色名是cadetblue。修正这个错误后代码就能正常运行了,另外还可以优化一下图表的可读性,比如调整点的大小、添加标签和旋转日期刻度:
import pandas as pd import numpy as np import matplotlib.pyplot as plt import datetime as dt start_date = '2014-01-01' end_date = '2016-02-01' data_range = pd.date_range(start=start_date, end=end_date, freq='H') values = np.random.randint(-100, 101, size=len(data_range)) df = pd.DataFrame({'date': data_range, 'Preis [€/MWh]': values}) df['month'] = df['date'].dt.month df['month_name'] = df['date'].dt.month_name(locale='German') # 修正颜色拼写错误,同时确保所有颜色都是Matplotlib可识别的名称 colors = { 'Januar': 'red', 'Februar': 'mediumvioletred', 'März': 'darkviolet', 'April': 'blueviolet', 'Mai': 'blue', 'Juni': 'cadetblue', 'Juli': 'green', 'August': 'greenyellow', 'September': 'yellow', 'Oktober': 'gold', 'November': 'orange', 'Dezember': 'coral' } df['colors'] = df['month_name'].map(colors) # 绘制优化后的散点图 plt.figure(figsize=(12, 6)) plt.scatter(df['date'], df['Preis [€/MWh]'], color=df['colors'], s=8) plt.xlabel('Datum') plt.ylabel('Preis [€/MWh]') plt.title('Strompreis pro Monat (farbcodiert)') plt.xticks(rotation=45) plt.tight_layout() # 自动调整布局,避免标签被截断 plt.show()
如果担心颜色名称拼写出错,也可以直接使用十六进制颜色码,比如把cadetblue换成#5F9EA0,这样更稳妥哦。
备注:内容来源于stack exchange,提问作者Horst-Jackson
相关产品推荐
相关产品推荐

