matplotlib画图教程系列之-堆积柱状图

  • Post author:
  • Post category:其他




matplotlib堆积柱状图画法介绍

堆积柱状图可以理解是两个柱状图显示在一个图形中,关键属性就在于bottom这个属性。

# -*- coding:utf-8 -*-
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
df = pd.read_csv('planets.csv')
print(df.head(10))
df.fillna(value={'mass':df.mass.mean()},inplace=True)
temp = pd.pivot_table(data=df,index='method',columns='number',values='mass',aggfunc=np.sum)
print(temp)
temp.fillna(0,inplace=True)
print(temp.columns.values)#获取dataframe 的x方向的属性值
print(temp.loc['Radial Velocity',:])
plt.rcParams['font.sans-serif']=['SimHei']#这两句作用为防止中文乱码
plt.rcParams['axes.unicode_minus']=False
plt.bar(x = temp.columns.values,height=temp.loc['Radial Velocity',:],color='steelblue',label='Astrometry', \
        tick_label=['数量1','数量2','数量3','数量4','数量5','数量6','数量7'])
plt.bar(x=temp.columns.values,height=temp.loc['Transit',:],color='red',label='Transit', \
        tick_label=['数量1','数量2','数量3','数量4','数量5','数量6','数量7'],bottom=list(temp.loc['Radial Velocity',:]))
plt.legend(loc='best')
plt.show()

直接看结果图:

在这里插入图片描述

关于柱状图如何画,我在这里就不赘述了,想了解的同学可以去看我之前写的对于画柱状图的介绍

matplotlib画图教程系列之-条形图

这里只说一下bottom这个属性,这个属性的意思是以什么数值为起点进行向上画图。

咱们看 第二个bar方法 ,bottom=list(temp.loc[‘Radial Velocity’,:])

这个bottom的值正是第一个bar方法中的,height=temp.loc[‘Radial Velocity’,:],的值。当然,这两个bar方法要保证使用同一个x坐标轴,也就是x属性的值要相同。



补充细节

上面说的太粗糙了,下面补充一些干货

首先我们先查看一下csv文件的数据形式:

image-20201020205928865

然后我们再看一下导入到程序中数据的显示形式:

image-20201020210000800

从两张图的对比,我们可以看到,原来csv文件中第一行列名,再导入程序中,自动被识别为了数据列名,行名默认数字0开始递增。

然后介绍下面这个方法:

pandas.pivot_table() 这个方法叫做透视表。

用过excel做过表格数据的肯定都知道这个东西,就算不知道也没事,下面详细介绍。

pandas.pivot_table(index,columns,values)

此方法中有三个参数:

  • index 选择属性作为行
  • columns 选择属性作为列
  • values 选择所要查看的结果值

另外说一下aggfunc这个参数,是对数据进行操作。

以下图表为例,假设同时具有属性’foo’=one和’bar’=A的数据有两条:

0 one A 1 x

1 one A 2 y

那么我们按照下图进行透视表操作结果是,只显示第一条数据。

如果我们添加aggfunc=np.sum方法,会将这两条数据求和显示。

看下面这个图:

image-20201020211554421

图中我们能够看到,‘foo’、‘bar’、‘baz’ 均是左边数据表格中的列名。

index=‘foo’ 表示将’foo’这一列所有可取值作为行名

columns=‘bar’ 表示将’bar’这一列所有可取值作为右边的列名

values=‘baz’ 表示将’baz’这一列的值作为最终显示结果。

其实说白了就是 我们将’foo’和’bar’ 对应值作为条件,将’baz’作为值,填入到相应的位置。

image-20201020211950285

好了,那么接下来回到我们自己的数据集上,我们对其进行透视表操作

image-20201021083751820

分别获取不同行的数据:

temp.loc[‘Radial Velocity’,:]

image-20201021085254542

temp.loc[‘Transit’,:]

image-20201021085329008

然后我们将这两组数据作为柱状图的height值。



版权声明:本文为lzx159951原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。