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文件的数据形式:
然后我们再看一下导入到程序中数据的显示形式:
从两张图的对比,我们可以看到,原来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方法,会将这两条数据求和显示。
看下面这个图:
图中我们能够看到,‘foo’、‘bar’、‘baz’ 均是左边数据表格中的列名。
index=‘foo’ 表示将’foo’这一列所有可取值作为行名
columns=‘bar’ 表示将’bar’这一列所有可取值作为右边的列名
values=‘baz’ 表示将’baz’这一列的值作为最终显示结果。
其实说白了就是 我们将’foo’和’bar’ 对应值作为条件,将’baz’作为值,填入到相应的位置。
好了,那么接下来回到我们自己的数据集上,我们对其进行透视表操作
分别获取不同行的数据:
temp.loc[‘Radial Velocity’,:]
temp.loc[‘Transit’,:]
然后我们将这两组数据作为柱状图的height值。