文章转载请联系我,叫我菜哥公众号。大家好,我是蔡哥。最近在做数据可视化的时候,希望能在图表上同时展示数据表格。对于这个需求,用excel比较方便,在快速布局中选择布局5即可。那么,如果我们想使用python来完成这个任务,我们应该怎么做呢?预期效果预览:excel作图效果1.Excel简单作图很简单,直接选择数据插入直方图,然后在图表工具-设计-快速布局中选择对应的布局即可。案例数据及效果Excel图表设计->快速排版->排版52.Python绘图这里我们使用matplotlib,bar和table。拆解图表元素可以分为柱状图和数据表,matplotlib只是提供了相应的接口。2.1直方图绘制首先绘制直方图。案例中有两组数据,所以是组合直方图。在这张图中,有以下知识点,可以记住:设置标题时的位置(由参数x,y指定)设置坐标轴标题时,使用参数rotation旋转方向设置范围坐标轴显示数据标签(使用ax.bar_label方法)importnumpyasnpimportmatplotlib.pyplotasplt#中文和负数显示plt.rcParams['font.sans-serif']=['MicrosoftYaHei']plt.rcParams['axes.unicode_minus']=False#创建画布fig,ax=plt.subplots(figsize=(10,4),dpi=100)#案例数据data=[[150,200,-50,-100,-75],[300,125,-80,75,-100],]#列和行columns=('Monday','Tuesday','Wednesday','Thursday','Friday')rows=['Caige','Nannan']#Graphing参数索引=np.arange(len(columns))-0.1bar_width=0.4#设置直方图的颜色colors=['turquoise','coral']#Histogrambar1=plt.bar(index,data[0],bar_width,color=colors[0],edgecolor='grey')bar2=plt.bar(index+bar_width,data[1],bar_width,color=colors[1],edgecolor='grey')#设置坐标轴标题ax.set_title('工作日收入',fontsize=16,y=1.1,x=0.44)#设置坐标轴标题ax.set_ylabel("元",fontsize=12,color='black',alpha=0.7,rotation=360)#设置Y轴间隔ax.set_ylim(-150,350)#显示数据标签ax.bar_label(bar1,label_type='edge')ax.bar_label(bar2,label_type='edge')#x,y轴刻度不显示ax.tick_params(axis=u'both',which=u'both',length=0)#x轴刻度和刻度值不显示plt.xticks([])输出如下:组合直方图2.2。Chart表格绘制先来看一下chart表格的绘制,我们单独绘制案例数据:#createcanvasfig,ax=plt.subplots(figsize=(10,4),dpi=100)#tablechartthe_table=plt.table(cellText=data,rowLabels=rows,rowColours=colors,colLabels=columns,cellLoc='center',loc="bottom",bbox=[0,-0.4,1,0.24])输出为如下:tableplt.table的参数介绍如下:cellText:表格单元格文字,目前不支持字符串换行,可能会导致文字超出单元格边界cellColours:表格单元格背景颜色cellLoc:表格单元格文字对齐方式,取值范围为{'left','center','right'},默认值为'right'colWidths:表格单元格宽度rowLabels:表格行标题文本rowColours:表格行标题背景颜色rowLoc:表格行标题文本对齐方式,取值范围为{'full','left','right'},默认值为'left'colLabels:表头文字colColours:表头背景色colLoc:表头文本对齐方式,取值范围为{'full','left','right'},默认值为'left'loc:unit网格相对于子图的位置bbox:最后绘制表格的边界框,我们需要做的就是将上面两张图进行组合,在组合的过程中可能需要对格式进行一些微调2.3.组合这种情况下,对组合图的要求如下:直方图的边框不显示。图表表格中列名的高度要高一些,单元格的高度要低一些。图例的位置需要和对应的行保持一致。需求,我们可以这样处理:#设置单元格高度cellDict=the_table.get_celld()foriinrange(0,len(columns)):cellDict[(0,i)].set_height(0.6)forjinrange(1,len(rows)+1):cellDict[(j,i)].set_height(0.4)#设置图表表格中行名单元格的高度cellDict[(1,-1)].set_height(0.4)cellDict[(2,-1)].set_height(0.4)#设置图表表格单元格文字字体the_table.auto_set_font_size(False)the_table.set_fontsize(10)#设置图表表格单元格边框forkey,cellinthe_table.get_celld().items():cell.set_linewidth(0.6)#borderhiddenax.spines['top'].set_visible(False)ax.spines['right'].set_visible(False)ax.spines['bottom'].set_visible(False)ax.spines['left'].set_visible(False)name=['','']#设置图例的位置ax.legend(name,handlelength=0.7,labelspacing=0.6,bbox_to_anchor=(-0.1,-0.23),loc='upperleft',frameon=False)最后我们可以得到一个满意的效果:上面的最终效果就是本次的全部内容,大家可以修改参数多尝试得到fami骗子吧。
