如何基于12个月度数组为散点图创建月份关联的颜色映射?
解决基于月份组数值的散点图颜色映射问题
我懂你要实现的效果——让每个散点的颜色对应它所属月份组里的split_data1数值,对吧?你之前的代码出问题的核心原因是:给plt.scatter的c参数传了二维数组split_data1(形状(12,30)),但这个参数需要和散点总数(360个)匹配的一维数组。咱们来修正这个问题:
核心解决方案:生成匹配形状的颜色数组
你已经把数据集重塑成了一维的split_months_reshape_data1和split_months_reshape_data2,那只需要把split_data1也按同样的规则重塑成一维数组,就能让每个点的颜色完美对应它所在月份组的数值。
完整代码示例
import matplotlib.pyplot as plt import numpy as np # 生成原始数据 data1 = np.random.rand(360) data2 = np.random.rand(360) # 按月份分组的函数 def split_months(monthly_data): month_split = [] for month in range(12): month_split.append(monthly_data[month::12]) return np.array(month_split) # 分组并重塑数据集 split_data1 = split_months(data1) split_data2 = split_months(data2) split_months_reshape_data1 = split_data1.reshape(12*30) split_months_reshape_data2 = split_data2.reshape(12*30) # 关键:生成和散点数量匹配的颜色数组 color_values = split_data1.reshape(12*30) # 绘制散点图 plt.scatter(split_months_reshape_data1, split_months_reshape_data2, c=color_values, cmap='viridis') plt.colorbar(label='Month Group Value from split_data1') plt.xlabel('Reshaped Data 1') plt.ylabel('Reshaped Data 2') plt.title('Scatter Plot with Month-Based Value Color Mapping') plt.show()
代码解释
color_values = split_data1.reshape(12*30):这个操作把(12,30)的二维数组转成和散点数量一致的一维数组,顺序和你重塑后的数据集完全对应——所有年份的1月数据在前,接着是2月,以此类推。这样每个点的颜色就会对应它所在月份组里的split_data1数值。- 你可以替换
cmap参数选择不同的配色方案,比如plasma、coolwarm等,满足可视化需求。
可选:如果想按月份(1-12)区分颜色
如果你其实是想让每个月份的点用统一的颜色(而不是用组内数值),可以生成一个月份标签数组,代码如下:
# 生成月份标签:1到12每个数字重复30次,共360个 month_labels = np.repeat(np.arange(1,13), 30) plt.scatter(split_months_reshape_data1, split_months_reshape_data2, c=month_labels, cmap='tab10') plt.colorbar(ticks=np.arange(1,13), label='Month (1-12)') plt.xlabel('Reshaped Data 1') plt.ylabel('Reshaped Data 2') plt.title('Scatter Plot with Month Category Color Mapping') plt.show()
这样每个月份的点会用同一种颜色,颜色条会显示对应的月份编号,方便区分不同月份的数据分布。
内容的提问来源于stack exchange,提问作者wabash
相关产品推荐
相关产品推荐

