首先如上图所示的图是如何画出来的呢,它主要是分三个部分, 首先第一部分是将四个单独的图按照横轴的方式叠加起来,第二部分是如何调节右上角图例的位置和大小,第三部分是标注出整个横轴和竖轴的坐标并调节字体的大小。
一.将四个图进行叠加在同一条横轴之上
#导入必要的包,画图所必需的matplotlib.pyplot
import pandas as pd
import matplotlib.pyplot as plt
fig, axs = plt.subplots(1, 4, figsize=(14, 5))
#将整个图划分为一行四列,呈横轴排列,共四个图,figsize是划定整个图的大小比例
data0 = pd.read_excel('data.xlsx')
data2 = data0.iloc[3,1:7]
labels_2 = data0.iloc[1,1:7]
colors = ['red', 'blue', 'green', 'orange', 'purple','pink']
导入所需的数据,可以将自己每一个柱子所要使用的颜色提前规定好,如上所示。
axs[1].bar(labels_2, data2, color=colors)
axs[1].set_title('E2')
# 不显示横坐标
axs[1].set_xticklabels([])
# Set y-axis limits
axs[1].set_ylim([0, 1.4])
data1 = data0.iloc[9,1:7]
labels_1 = data0.iloc[1,1:7]
colors = ['red', 'blue', 'green', 'orange', 'purple','pink']
axs[0].bar(labels_1, data1, color=colors)
axs[0].set_title('E1')
# 不显示横坐标
axs[0].set_xticklabels([])
axs[0].set_ylim([0, 1.4])
# plt.ylabel('产量')
data3 = data0.iloc[15,1:7]
labels_3 = data0.iloc[1,1:7]
colors = ['red', 'blue', 'green', 'orange', 'purple','pink']
axs[2].bar(labels_3, data3, color=colors)
axs[2].set_title('E3')
# 不显示横坐标
axs[2].set_xticklabels([])
axs[2].set_ylim([0, 1.4])
data4 = data0.iloc[21,1:7]
labels_4 = data0.iloc[1,1:7]
colors = ['red', 'blue', 'green', 'orange', 'purple','pink']
axs[3].bar(labels_4, data4, color=colors)
axs[3].set_title('E4')
# 不显示横坐标
axs[3].set_xticklabels([])
axs[3].set_ylim([0, 1.4])
接着开始将每一个小图所需的数据和命令导入,将每一个小图画好再按照横轴进行叠加。
执行完上述命令便得到没有图例和大的横纵坐标的堆叠条形图,如上图所示,大家还可以看到我的代码中有标注不显示横坐标这一选项,通过如下代码实现,可对每一个单独小图设定,如将下图所示代码注释后,第四个小图中每种颜色代表的含义便会显现出来。
axs[3].set_xticklabels([])
大家此时还可以看出上述代码中有如下所示代码程序,此时是指设置每个小图纵坐标的刻度,由上图可知我们所设置的范围都是0-1.4,将每个小图的纵坐标设置相同的范围便于进行比较。
axs[3].set_ylim([0, 1.4])
二.导入数据将小图画完之后下一步开始进行右上角图例的绘制,将每一个颜色代表的含义通过图例表达出来。
加上图例之后我们便可以看到如下图所示代码,且图例的位置可调节。
import matplotlib.patches as mpatches
labels11 = ['XGB', 'RF', 'SVR_rbf', 'SVR_linear', 'LGB', 'Stacking']
# Create patch objects for each color
patches = [mpatches.Patch(color=c, label=labels11) for c in colors]
# Add the legend to the plot
# axs[3].legend(handles=patches, bbox_to_anchor=(1.05, 1), loc='upper left')
axs[3].legend(handles=patches, labels=labels11,bbox_to_anchor=(1.05, 1), loc='upper left')
# plt.xlabel('Wheat599')
fig = plt.gcf()
如上所示代码,执行之后就加入了图例,颜色所对应的标签应该是可以直接读入的,因为格式不太对,这里便直接读取了浮点数进行转换。
bbox_to_anchor=(1.05, 1), loc='upper left'
这一行代码可调整图例的位置距离具体放在哪个位置。
三.有了图例之后我们没有画出每个小图的横纵坐标,所以此时我们为这个大图添加总的横纵坐标,一个横向一个纵向就形成了最终的图,同时大小可调节。
from matplotlib.font_manager import FontProperties
font = FontProperties(size=20)
# fig.suptitle('Pearson correlation coefficient (PCC)', fontsize=20)
fig.text(0.5, 0.04, 'Wheat599', ha='center',fontproperties=font)
fig.text(0.08, 0.5, 'RMSE', va='center', rotation='vertical',fontproperties=font)
plt.show()
此时的大小通过size参数进行调整,且位置可以进行调整,我们此时看到横坐标轴的横坐标和纵坐标轴的纵坐标大小都是0.5,此时的参数不是指画的图上的纵坐标的刻度大小。
总的代码如下
#RMSE均方根误差
import pandas as pd
import matplotlib.pyplot as plt
import matplotlib.patches as mpatches
# 设置matplotlib正常显示中文和负号
plt.rcParams['font.sans-serif']=['SimHei'] # 用黑体显示中文
plt.rcParams['axes.unicode_minus']=False # 正常显示负号
fig, axs = plt.subplots(1, 4, figsize=(14, 5))
data0 = pd.read_excel('jieguoxin.xlsx')
data2 = data0.iloc[3,1:7]
labels_2 = data0.iloc[1,1:7]
colors = ['red', 'blue', 'green', 'orange', 'purple','pink']
axs[1].bar(labels_2, data2, color=colors)
axs[1].set_title('E2')
# 不显示横坐标
axs[1].set_xticklabels([])
# Set y-axis limits
axs[1].set_ylim([0, 1.4])
data1 = data0.iloc[9,1:7]
labels_1 = data0.iloc[1,1:7]
colors = ['red', 'blue', 'green', 'orange', 'purple','pink']
axs[0].bar(labels_1, data1, color=colors)
axs[0].set_title('E1')
# 不显示横坐标
axs[0].set_xticklabels([])
axs[0].set_ylim([0, 1.4])
# plt.ylabel('产量')
data3 = data0.iloc[15,1:7]
labels_3 = data0.iloc[1,1:7]
colors = ['red', 'blue', 'green', 'orange', 'purple','pink']
axs[2].bar(labels_3, data3, color=colors)
axs[2].set_title('E3')
# 不显示横坐标
axs[2].set_xticklabels([])
axs[2].set_ylim([0, 1.4])
data4 = data0.iloc[21,1:7]
labels_4 = data0.iloc[1,1:7]
colors = ['red', 'blue', 'green', 'orange', 'purple','pink']
axs[3].bar(labels_4, data4, color=colors)
axs[3].set_title('E4')
# 不显示横坐标
axs[3].set_xticklabels([])
axs[3].set_ylim([0, 1.4])
import matplotlib.patches as mpatches
labels11 = ['XGB', 'RF', 'SVR_rbf', 'SVR_linear', 'LGB', 'Stacking']
# Create patch objects for each color
patches = [mpatches.Patch(color=c, label=labels11) for c in colors]
# Add the legend to the plot
# axs[3].legend(handles=patches, bbox_to_anchor=(1.05, 1), loc='upper left')
axs[3].legend(handles=patches, labels=labels11,bbox_to_anchor=(0.85, 1), loc='upper left')
# plt.xlabel('Wheat599')
fig = plt.gcf()
from matplotlib.font_manager import FontProperties
font = FontProperties(size=20)
# fig.suptitle('Pearson correlation coefficient (PCC)', fontsize=20)
fig.text(0.5, 0.04, 'Wheat599', ha='center',fontproperties=font)
fig.text(0.08, 0.5, 'RMSE', va='center', rotation='vertical',fontproperties=font)
plt.show()