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