Python中带图例的条形图的具体画法和参数调节

首先如上图所示的图是如何画出来的呢,它主要是分三个部分, 首先第一部分是将四个单独的图按照横轴的方式叠加起来,第二部分是如何调节右上角图例的位置和大小,第三部分是标注出整个横轴和竖轴的坐标并调节字体的大小。

一.将四个图进行叠加在同一条横轴之上

#导入必要的包,画图所必需的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()

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值