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

2021-02-22 15:12:20 浏览数 (1)

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:DataCharmSCI paper plotssci_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:DataCharmSCI paper plotsbar_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:DataCharmSCI paper plotssci_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柱形图的补充,当然,我希望此类教程越多越好,因为这是和大家交流互动的结果

0 人点赞