如何从列表或字典中为我的子图添加标题?

How can I add titles to my subplots from a list or dictionary?

我正在编写一个代码来绘制不同气象季节的各种热图。我想看看不同可再生能源与需求之间的相关性。我创建了一个名为“core_matrix”的列表,其中列表中的每个整数对应于不同季节的相关矩阵。

目前,根据我设置列表和程序的方式,我在处理子图的标题时遇到了问题。当我在 ax.set_title... 行中使用标题列表时,出现错误:raise ValueError(f"Must pass 2-d input. shape={values.shape}") ValueError: Must pass 2-d input. shape=()

有人可以帮我解决这个问题吗?

下面是我的代码的副本:


#load df and prepare data
df=pd.read_excel("df3_demand_cfs.xlsx", header=0,index_col=0)
df=df.drop_duplicates(subset="Dates")
df['del_dates']=df["Dates"]
df=df.set_index("Dates")

#####
df.drop(columns=["demand_MWh","hour","monthday",'month'],axis=1,inplace=True)
df=df.rename(columns={"wind capacity":'OnSW',"solar capacity":"Solar","osw capacity":"OSW","norm_demand":'Demand'})
df.sort_index(inplace = True)


# In[3]:
mon=[*range(0,17)]
dates=[*range(0,17)]
orr_matrix=[*range(0,17)]
corr_matrix_list=["JF 15", 'MAM','JJA','SON','DJF 15/16','MAM','JJA','SON','DJF 16/17','MAM','JJA','SON','DJF 17/18','MAM','JJA','SON','D 18']



#mon[0] = pd.DataFrame(df.loc['2015-01':'2015-02'])
mon[0] = df.loc['2015-01':'2015-02']
mon[1] = df.loc['2015-03':'2015-05']
mon[2] = df.loc['2015-06':'2015-08']
mon[3] = df.loc['2015-09':'2015-11']
mon[4] = df.loc['2015-12':'2016-02']
mon[5] = df.loc['2016-03':'2016-05']
mon[6] = df.loc['2016-06':'2016-08']
mon[7] = df.loc['2016-09':'2016-11']
mon[8] = df.loc['2016-12':'2017-02']
mon[9] = df.loc['2016-03':'2017-05']
mon[10] = df.loc['2016-06':'2017-08']
mon[11] = df.loc['2016-09':'2017-11']
mon[12] = df.loc['2017-12':'2018-02']
mon[13] = df.loc['2018-03':'2018-05']
mon[14] = df.loc['2018-06':'2018-08']
mon[15] = df.loc['2018-09':'2018-11']
mon[16] = df.loc['2018-12':'2019-02']

# In[4]:
for i in range(len(mon)):
    mon[i]=mon[i].drop(columns=['del_dates'],axis=1)
    corr_matrix[i] = mon[i].corr(method="spearman")
    corr_matrix[i] = corr_matrix[i].round(2)

# In[5]:
fs1=10
# plt.rcParams["font.family"] = "Helvetica"
font_title = {'family': 'serif',
        'color':  'black',
        'weight': 'bold',
        'size': fs1,
        }

font_label = {'family': 'serif',
        'color':  'black',
        'weight': 'bold',
        'size': fs1,
        }

fs2=14
plt.rc('xtick', labelsize=fs2)
plt.rc('ytick', labelsize=fs2)
plt.rcParams["font.family"] = "serif"

fig, axes = plt.subplots(nrows=4, ncols=4, figsize=(25,15))
for i,ax in enumerate(axes.flatten()):
    ax.set_title(i, fontsize = fs1, loc='center',fontdict=font_title)
    sns.heatmap(corr_matrix_list[i],
            ax=ax,
            annot=True,
            linewidth=.01,
            square=True,
            annot_kws={"size": 16},
            vmin=-1,
            vmax=1,
            cmap="RdBu")
    ax.tick_params(axis='y', labelrotation=0)
    ax.tick_params(axis='x', labelrotation=45)

#plt.tight_layout()
plt.tight_layout(1,1,1)
plt.savefig('heatmaps_monthly.png')
plt.show()

我回答了我自己的问题!虽然我不确定为什么这解决了问题或最初出了什么问题。

我加了

axes=axes.flatten() 我用 for 循环更改了行:for i,ax in enumerate(axes):

所以现在我的代码的最后一部分如下所示:

fig, axes = plt.subplots(nrows=4, ncols=4, figsize=(25,15))
axes=axes.flatten()
for i,ax in enumerate(axes):
    ax.set_title(str(corr_matrix_list[i]), fontsize = fs1, loc='center',fontdict=font_title)
    sns.heatmap(corr_matrix[i],
            ax=ax,
            annot=True,
            linewidth=.01,
            square=True,
            annot_kws={"size": 16},
            vmin=-1,
            vmax=1,
            cmap="RdBu")
    ax.tick_params(axis='y', labelrotation=0)
    ax.tick_params(axis='x', labelrotation=45)

#plt.tight_layout()
plt.tight_layout(1,1,1)
plt.savefig('heatmaps_monthly.png')
plt.show()