前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Python-matplotlib 横向堆积柱状图绘制

Python-matplotlib 横向堆积柱状图绘制

作者头像
DataCharm
发布2021-02-22 15:12:20
5.8K1
发布2021-02-22 15:12:20
举报

01. 引言

之前以为Python-matplotlib 柱状图的绘制以为够全面了

,经群里爱学习的小伙伴们提醒,居然漏了一个常用的柱状图形式。看吧····知识点还是没有系统起来(最近也在对各种图表进行系统规整哦,包括学术和商业的

)。对了,感谢 南信大 - 杨豪 同学提供的数据啊,我也希望大家多沟通交流,共同进步

02. 类型一数据及可视化

Python-matplotlib 绘制横向柱形图主要使用ax.barh()函数进行绘制,主要参数和基本的柱状图相同,但想要绘制出堆积的横线柱形图,则需设置left参数,其具体意义和ax.bar()函数中 的bottom参数相同,大家可以看我这篇文章Python-matplotlib 堆积柱状图绘制

一、数据形式

数据为虚构数据,具体形式如下:

使用ax.barh()绘制的代码如下:

代码语言:javascript
复制
index = np.arange(0,len(test_bar))
class_01= test_bar['Class_01'].values
class_02= test_bar['Class_02'].values
class_03= test_bar['Class_03'].values
class_04= test_bar['Class_04'].values

fig, ax = plt.subplots(figsize=(8,5),dpi=200)
ax.barh(index, class_01, height=.5,color='lightgray', ec='k', label='Class_01')
ax.barh(index, class_02, height=.5,color='darkgray', ec='k', label='Class_02', left=class_01)
ax.barh(index, class_03, height=.5,color='gray', ec='k', label='Class_03', left=class_01 + class_02)
ax.barh(index, class_04, height=.5,color='dimgray', ec='k', label='Class_04', left=class_01 + class_02+class_03,
        hatch=".")
#自定义y轴坐标
y_label = ('A', 'B', 'C', 'D')
y_pos = np.arange(len(y_label))
ax.set_yticks(y_pos)
ax.set_yticklabels(y_label)
#定制化绘制
ax.tick_params(direction='out',labelsize=18,length=5.5,width=1.5)
ax.set_xlim(left=0,right=75)
for spine in ['bottom','left']:
    ax.spines[spine].set_linewidth(1.5)
ax.spines['right'].set_visible(False)
ax.spines['top'].set_visible(False)

ax.legend(frameon=False,fontsize=12)
text_font = {'size':'22','weight':'bold','color':'black'}
ax.text(.94,.93,"(a)",transform = ax.transAxes,fontdict=text_font,zorder=4)
ax.text(.91,-.09,'\nVisualization by DataCharm',transform = ax.transAxes,
        ha='center', va='center',fontsize = 5,color='black',fontweight='bold',family='Roboto Mono')
plt.savefig(r'F:\DataCharm\SCI paper plots\sci_Stacked_Bar01_1',width=5,height=3,
            dpi=900,bbox_inches='tight')

知识点:

(1)颜色使用了lightgray、darkgray、gray、dimgray等matplotlib自带颜色

(2)注意每个barh()的left参数 设置,本期推文设置具体如下:

代码语言:javascript
复制
left=class_01
left=class_01 + class_02
left=class_01 + class_02+class_03

注意,第一个barh()是不设置left参数的

(3)自定义刻度标签。这个方法大家还是需要掌握的,实际应用中用的也比较多。代码如下:

代码语言:javascript
复制
#自定义y轴坐标
y_label = ('A', 'B', 'C', 'D')
y_pos = np.arange(len(y_label))
ax.set_yticks(y_pos)
ax.set_yticklabels(y_label)

当然也适用于X轴。最终效果如下:

03. 类型二数据及可视化

这里用到的就是杨豪 同学提供 的数据了,由于是txt文本数据,我们需要使用pandas进行读取,如下:

代码语言:javascript
复制
bar_data = pd.read_table(r'F:\DataCharm\SCI paper plots\bar_data.txt',header=None,names=['A','B','C','D'])
bar_data.head()

这里设置了header=None,names=['A','B','C','D'],这对txt格式数据读取经常用到,即数据没有列名,自己进行赋值,希望大家记住啊 。结果如下(部分):

这里由于绘制的图为“左右”类型,可能涉及到负值,使用barn()绘制,具体代码如下:

代码语言:javascript
复制
plt.rcParams['font.family'] = "Times New Roman"
from matplotlib.pyplot import MultipleLocator

fig, ax = plt.subplots(figsize=(8,5),dpi=200)
position = np.arange(1,len(bar_data)+1)
ax.barh(position,bar_data['A'].values,zorder=4,color='#00468B',ec='k',lw=1,label='A')
ax.barh(position,bar_data['B'].values,zorder=3,color='#ED2200',ec='k',lw=1,label='B')
ax.barh(position,bar_data['C'].values,zorder=2,color='#42B540',ec='k',lw=1,label='C')
ax.barh(position,bar_data['D'].values,zorder=1,color='#0099B4',ec='k',lw=1,label='D')

#添加竖线
ax.axvline(x=0,color='k',lw=.8)
for spine in ['bottom','left','right','top']:
    ax.spines[spine].set_linewidth(1.5)
ax.set_yticks(np.arange(0,23,2)) 
ax.set_ylim(bottom=0,top=22)
ax.set_xlim(left=-12,right=12)
#修改次刻度
yminorLocator = MultipleLocator(1) #将此y轴次刻度标签设置为0.1的倍数
xminorLocator = MultipleLocator(2.5)
ax.yaxis.set_minor_locator(yminorLocator)
ax.xaxis.set_minor_locator(xminorLocator)
ax.tick_params(which='major',direction='out',labelsize=13,length=5.5,width=1.5)
ax.tick_params(which='minor',direction='out',length=4,width=1)
#添加图例
ax.legend(frameon=False,loc='upper right',fontsize=10)
text_font = {'size':'20','weight':'bold','color':'black'}
ax.text(.03,.91,"(a)",transform = ax.transAxes,fontdict=text_font,zorder=4)
ax.text(.91,-.08,'\nVisualization by DataCharm',transform = ax.transAxes,
        ha='center', va='center',fontsize = 5,color='black',fontweight='bold',family='Roboto Mono')
plt.savefig(r'F:\DataCharm\SCI paper plots\sci_Stacked_Bar01',width=7,height=4,
            dpi=900,bbox_inches='tight')

知识点:

(1)ax.axvline()添加竖线

代码语言:javascript
复制
#添加竖线
ax.axvline(x=0,color='k',lw=.8)

其他如线类型 - lw,透明度 - alpha 等参数均可自行设置

(2)由于数据原因,我们没有设置left参数,而是设置zorder参数进行了图层顺序的调整。

(3)颜色自定义。使用 FastStone Capture软件吸取R-ggsci包的色系。

(4)添加副刻度。

代码语言:javascript
复制
from matplotlib.pyplot import MultipleLocator
#修改次刻度
yminorLocator = MultipleLocator(1) #将此y轴次刻度标签设置为0.1的倍数
xminorLocator = MultipleLocator(2.5)
ax.yaxis.set_minor_locator(yminorLocator)
ax.xaxis.set_minor_locator(xminorLocator)

效果如下:

通过设置R-ggsci包的其他色系:效果依次如下:关注color参数即可

代码语言:javascript
复制
ax.barh(position,bar_data['A'].values,zorder=4,color='#0073C2',ec='k',lw=1,label='A')
ax.barh(position,bar_data['B'].values,zorder=3,color='#EFC000',ec='k',lw=1,label='B')
ax.barh(position,bar_data['C'].values,zorder=2,color='#868686',ec='k',lw=1,label='C')
ax.barh(position,bar_data['D'].values,zorder=1,color='#CD534C',ec='k',lw=1,label='D')
代码语言:javascript
复制
ax.barh(position,bar_data['A'].values,zorder=4,color='#FF6F00',ec='k',lw=1,label='A')
ax.barh(position,bar_data['B'].values,zorder=3,color='#C71B00',ec='k',lw=1,label='B')
ax.barh(position,bar_data['C'].values,zorder=2,color='#018EA0',ec='k',lw=1,label='C')
ax.barh(position,bar_data['D'].values,zorder=1,color='#8A4198',ec='k',lw=1,label='D')

04. 总结

本期推文算是一个Matplotlib柱形图的补充,当然,我希望此类教程越多越好,因为这是和大家交流互动的结果

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-09-04,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 DataCharm 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 01. 引言
  • 02. 类型一数据及可视化
  • 03. 类型二数据及可视化
  • 04. 总结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档