python:利⽤pandas进⾏绘图(总结)基础篇
利⽤python进⾏数据分析
第⼋章:绘图和可视化
pandas绘图总结
pandas中的绘图函数(更加详细的绘图资料可参考pandas.pdf⽂档中的Visualization这⼀章)
>>> import pandas as pd
>>> import numpy as np
>>> from pandas import Series, DataFrame
>>> import matplotlib.pyplot as plt
>>> import matplotlib
>>> matplotlib.style.use('ggplot')
1,绘图⼊门
在绘图之前先准备数据,数据形式必须是np.array()形式的数组数据,利⽤上⾯导⼊的matplotlib模块进⾏绘图;
例⼦:
>>> np.arange(20)
array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19])
>>> plt.plot(np.arange(20))
thinkphp后台框架[<matplotlib.lines.Line2D object at 0x2ac914e15fd0>]
>>> plt.show()
最后⽣成⼀个由点连接的y=x的线性图
>>> plt.plot(np.array([2.5, 4.1, 2.7, 8.8, 1.0])) #⽣成由5个点组成的两个点之间⽤线连接的折线
如果想利⽤pandas绘图,可得到Series或DataFrame对象,并利⽤series.plot()或dataframe.plot()进⾏绘图;
例⼦:
>>> Series(np.array([2.5, 4.1, 2.7, 8.8, 1.0]))
0 2.5
1 4.1
2 2.7
3 8.8
4 1.0
dtype: float64
>>> series=Series(np.array([2.5, 4.1, 2.7, 8.8, 1.0]))
>>> series.plot()
<matplotlib.axes._subplots.AxesSubplot object at 0x2ac914bab250>
>>> plt.show()
利⽤Series⽅法得到的折线图和plt.plot(np.arange(20))绘制的折线图图像⼤致相似,但图形的X轴坐标与Series的索引值相对应,X轴坐标从0到4,坐标原点为(0, 0);
⽽对于DataFrame绘图,则其每个column都为⼀个绘图图线,会将每个column作为⼀个图线都绘制到⼀张图⽚当中,并⽤不同的线条颜⾊及不同的图例标签进⾏表⽰;
例如:
>>> dataframe=DataFrame({'A':[9.3, 4.3, 4.1, 5.0, 7.0], 'B':[2.5, 4.1, 2.7, 8.8, 1.0]})
>>> dataframe
A B
0 9.3 2.5
站长工具日本亚洲欧洲1 4.3 4.1
2 4.1 2.7
3 5.0 8.8
4 7.0 1.0
>>> dataframe.plot()
<matplotlib.axes._subplots.AxesSubplot object at 0x2ada670665d0>
>>> plt.show()
··· ···所有绘图
会得出与上述相同的结果
· ‘bar’ or ‘barh’ for bar plots #条状图
· ‘hist’ for histogram #频率柱状图(计算某些值出现的频率)
· ‘box’ for boxplot #箱线图()
·
‘kde’ or ‘density’ for density plots #密度图(需要scipy这个包)
· ‘area’ for area plots #区域图(不同域的⾯积占⽐)
· ‘scatter’ for scatter plots #散点图 >>> plt.scatter(df['part A'], df['part B'])
· ‘hexbin’ for hexagonal bin plots # >>> plt.hexbin(df['part A'], df['part B'], df['part C'])
· ‘pie’ for pie plots #饼图,⽐较适合与Series对象,看不同的占⽐
上⾯罗列了所有可能绘制的图形
df.plot.<TAB> #可以利⽤".<TAB>"的⽅法绘制不同的图像
df.plot.area df.plot.barh df.plot.density df.plot.hist df.plot.line df.plot.scatter df.plot.bar df.plot.box df.plot.hexbin df.plot.kde df.plot.pie
2,线型图(Series.plot⽅法的参数,专⽤DataFrame的plot参数)
对于Series.plot⽅法的参数,DataFrame是可以应⽤的
style参数,表⽰传给matplotlib的风格的字符串(如’ko–’),其中‘k’表⽰的是线条颜⾊,对于线条颜⾊的种类还有以下⼏个细分: Alias Colors
b Blue
g Green
r Red
c Cyan
m Magenta
y Yellow
k Black
w White
其中‘o’表⽰线条中点的存在形式,o表⽰实⼼圆点,x表⽰x型点;
其中‘-’表⽰线型,‘-’表⽰实线,‘–’表⽰虚线。
也可将这三者表⽰形式分开,写法如:
>>> series.plot(linestyle='dashed', color='k', marker='o')
>>> series.index.name='site'
Series对象的index.name值,在⽣成图表后会⽣成X轴的标签
对于DataFrame对象,其⽣成的表格的column值在进⾏绘图后会⽣成图例标签
>>> dataframe.plot(linestyle='dashed', color='k', marker='o', xticks=[0, 1, 2, 3, 4], yticks=list(np.arange(0, 10.0, 0.5)) ,xlim=[-0.25, 4.25])
设定X及Y轴刻度值,以及X轴的刻度界限
>>> dataframe.plot(title='dataframe photo') #加⼊图像的标题
在绘图命令中加⼊subplots=True参数,则会将DataFrame当中的每⼀列结果绘制到⼀个⼦图⽚中,如果加⼊sharex=True参数,则各个⼦图⽚共⽤⼀个X轴标签;同理sharey=True表⽰共⽤⼀个Y轴;
>>> dataframe.plot(subplots=True, sharex=True)
array([<matplotlib.axes._subplots.AxesSubplot object at 0x06A627F0>, <matplotlib.axes._subplots.AxesSubplot object at 0x06E4E0D0>], dtype=object) >>> plt.show()
3,柱状图
在⽣成线形图的代码中加⼊kind=’bar’(垂直柱状图)或kind=’barh’(⽔平柱状图)即可⽣成柱状图。这时,Series和DataFrame 的索引将会被⽤作X(bar)或Y(barh)刻度
>>> dataframe.plot(kind='bar')········>>> dataframe.plot(kind='barh')
⽣成柱状图,DataFrame对象的每⼀列会⽣成⼀个柱状图结果,多个列会将这个结果绘制在⼀个表格中,不同的列所绘制的柱状图颜⾊不同;
>>> dataframe.index=['once', 'twice', 'thrice', 'forth', 'fifth']
>>> dataframe
··A·B
once·9.3·2.5
twice·4.3·4.1
thrice·4.1·2.7
forth·5.0·8.8
fifth·7.0·1.0
绘制的柱状图的X轴或Y轴标签为DataFrame对象的index值
python代码画图案plt.figure(); dataframe.plot(kind=’bar’); plt.axhline(0, color=’k’),”.axhline”的主要作⽤是在纵轴x=0的位置加⼊⼀条⿊⾊的直线,来分隔y>0的轴和y<0的轴。
堆积柱状图:设置stacked=True即可为DataFrame⽣成堆积柱状图,这样每⾏的值就会被堆积在⼀起:
>>> df=DataFrame({'part A': [2.8, 5.5, 4.5, 7.0, 1.0], 'part B': [4.2, 1.2, 4.5, 2.5, 8.0], 'part C': [3.0, 3.3, 1.0, 0.5, 1.0]}, index=['May', 'June', 'July', 'August', 'September'])
>>> df.name='bonus'
>>> df
···part A·part B·part C
May·2.8·4.2·3.0
June·5.5·1.2·3.3
July·4.5·4.5·1.0
August·7.0·2.5·0.5
September·1.0·8.0·1.0
>>> df.plot(kind='barh', stacked=True)
最终绘制出堆积图,同时:
>>> df.plot.barh(stacked=True)
4,直⽅图密度图
直⽅图(histogram)是⼀种可以对值频率进⾏离散化显⽰的柱状图。数据点被拆分到离散的、间隔均匀的⾯元中,绘制的是各⾯元中数据点的数量。
>>> length=DataFrame({'length': [10, 20,15,10,1,12,12,12,13,13,13,14,14,14,51,51,51,51,51,4,4,4,4]})
>>> length.plot.hist()
>>> plt.show()
最终得到的数字频率分布直⽅图,X轴是DataFrame当中的数值分布,Y轴是对应数值出现的次数;
密度图,利⽤数值出现频率绘制的直⽅图进⾏曲线拟合,会得到密度图;绘制的图形是根据直⽅图得到的条状分布的顶点连接后得到的平滑曲线,X轴是DataFrame当中的数值分布,Y轴是密度(Density)。
>>> length.plot.density(color='k') #length.plot.kde(color=’k’)得到同样的图形结果
>>> plt.show()
直⽅图画法进阶
>>> df4 = DataFrame({'a': np.random.randn(1000) + 1, 'b': np.random.randn(1000), 'c': np.random.randn(1000) - 1}, index=range(1,1001), columns=['a', 'b', 'c'])
设定1000个随机数为column b,⽽随机数的数值+1和-1作为column a和column c;
>>> plt.figure() #表⽰设定绘制图标对象
>>> df4.plot.hist(stacked=True, bins=20, alpha=0.5) #bins=20表⽰数值分辨率,具体来说是将随机数设定⼀个范围,例如5.6,5.7,6.5,如果数值分辨率越低,则会将三个数分到5-7之间,如果数值分辨率越⾼,则会将5.6,5.7分到5-6之间,⽽6.5分到6-7之间;值越⼩表⽰分辨率越低,值越⼤表⽰分辨率越⾼;
>>> df4['a'].plot.hist(orientation='horizontal', cumulative=True) #该图是将DataFrame对象当中的a进⾏数值累加,并绘制横向直⽅图,横轴表⽰频率(Frequency),纵轴表⽰数值,cumulative=True的效果是将Frequency的数值从⼤到⼩进⾏排列。
>>> df4.diff().hist(color='k', alpha=0.5, bins=50) #该效果是将DataFrame当中column分开,即将a,b和c分开绘制成三张图。df4.diff().hist()可达到这个效果,即将所有column分开。
5,箱线图
箱线图可以⽤如下⽅式绘制
Series.plot.box(), DataFrame.plot.box(), DataFrame.boxplot()
程序员用的文本编辑器例如:
>>> df = pd.DataFrame(np.random.rand(10, 5), columns=['A', 'B', 'C', 'D', 'E'])
>>> df.plot.box()
绘制ABCDE这5个箱线图
np.random.rand产⽣的随机数都为0-1之间的正数,⽽np.random.randn产⽣的随机数中既有正值⼜有负值
修改箱线图线条颜⾊需要有⼀下4个⽅⾯,即boxes(盒⾝),whiskers(须),
medians(中位数),caps(最⼤值,最⼩值),可以将颜⾊与上⾯的4个keys建⽴字典关系,并在绘图时引⼊color。
>>> color = dict(boxes='DarkGreen', whiskers='DarkOrange', medians='DarkBlue', caps='Gray'))
>>> df.plot.box(color=color, sym='r+') #boxplot has sym keyword to specify fliers style
>>> df.plot.box(color=color) #绘图效果和上述⼀样
盒⾝为深绿⾊,须为深黄⾊,中位数为深蓝⾊,最⼤最⼩值为灰⾊
>>> df.plot.box(vert=False, positions=[1, 4, 5, 6, 8]) #可绘制⽔平箱线图,positions表⽰的意思是ABCDE这5个箱线图摆放位置,A在1位
置,B在4位置,AB之间间隔2,3这两个位置。
同样,也可以根据DataFrame属性当中的’by’参数进⾏分组画图
You can create a stratified boxplot using the by keyword argument to create groupings
>>> df = pd.DataFrame(np.random.rand(10,2), columns=['Col1', 'Col2'] )
>>> df['X'] = pd.Series(['A','A','A','A','A','B','B','B','B','B']) #在df存在Col1和Col2两列的基础上增加X这⼀列,然后根据index编号进⾏赋值;对于DataFrame对象以Series⽅法增加column。
>>> plt.figure(); bp = df.boxplot(by='X')
注意:如果⽤>>> plt.figure(); df.plot.box(by='X')或者>>> df.plot.box(by='X')⽅法绘制图⽚,最终不会得到分组的画图效果
使⽤两组标签可以实现多分组绘图
>>> df = pd.DataFrame(np.random.rand(10,3), columns=['Col1', 'Col2', 'Col3'])
>>> df['X'] = pd.Series(['A','A','A','A','A','B','B','B','B','B'])
>>> df['Y'] = pd.Series(['A','B','A','B','A','B','A','B','A','B'])
>>> df
Col1 Col2 Col3 X Y
0 0.081142 0.059051 0.862650 A A
1 0.142670 0.55486
2 0.93137
3 A B
2 0.720987 0.968380 0.560167 A A
idex3 0.104103 0.031059 0.832768 A B
4 0.153403 0.050152 0.747177 A A
5 0.146358 0.016951 0.013774 B B
6 0.38761
7 0.485473 0.583479 B A
7 0.447248 0.498259 0.424981 B B
8 0.539854 0.386803 0.410169 B A
9 0.129224 0.910483 0.348707 B B
>>> plt.figure(); bp = df.boxplot(column=['Col1','Col2'], by=['X','Y'])
最终绘制的图⽚样式为,出现两个分组,分组后的X轴的⼤标签是[X, Y],每个分组的X轴的⼩标签为(A, A) (A, B) (B, A) (B ,B),这样绘图也是根据df的X列和Y列的分组结果⽽得到的。
6,区域⾯积图商城系统安装
绘图⽅式:Series.plot.area()和DataFrame.plot.area()
NA值的处理⽅法:
When input data contains NaN, it will be automatically filled by 0. If you want to drop or fill by different values, use dataframe.dropna() or dataframe.fillna() before calling plot
>>> df = pd.DataFrame(np.random.rand(10, 4), columns=['a', 'b', 'c', 'd'])
>>> df.plot.area() #⽣成堆积图
>>> df.plot.area(stacked=False) #⾮堆积效果图
7,散点图
绘图⽅式:DataFrame.plot.scatter()
散点图需要设定X轴及Y轴的数值;Scatter plot requires numeric columns for x and y axis.
>>> df = pd.DataFrame(np.random.rand(50, 4), columns=['a', 'b', 'c', 'd'])#abcd四列中,各列设定50个随机数
>>> df.plot.scatter(x='a', y='b') #之后以a列为X轴数值,b列为Y轴数值绘制散点图
如果想将不同的散点图信息绘制到⼀张图⽚当中,需要利⽤不同的颜⾊和标签进⾏区分
To plot multiple column groups in a single axes, repeat plot method specifying target ax. It is recommended to specify color and label keywords to distinguish each groups.
>>> ax = df.plot.scatter(x='a', y='b', color='DarkBlue', label='Group 1') #先设定第⼀个散点图,颜⾊为深蓝⾊标签为Group 1,以ab两列作为x及y 轴的值
>>> df.plot.scatter(x='c', y='d', color='DarkGreen', label='Group 2', ax=ax) #第⼆个散点图以cd两列作为x及y轴的值,颜⾊为深绿⾊标签为Group 2,ax=ax的作⽤是将ax这个图绘制到Group 2图⽚当中,形成两层图形嵌套关系
如果想得到4层图形嵌套关系需要运⽤如下⽅法:
>>> ab=df.plot.scatter(x='a', y='b', color='DarkBlue', label='Group 1') #a列与b列的绘图关系
>>> abcd=df.plot.scatter(x='c', y='d', color='DarkGreen', label='Group 2', ax=ab) #将ab的绘图关系嵌套到c列和d列的绘图关系中:ax=ab >>> abcdac=df.plot.scatter(x='a', y='c', color='DarkRed', label='Group 3', ax=abcd) #将ab的绘图关系及cd的绘图关系的汇总关系当中加⼊到a列和c列的绘图关系中:ax=abcd
>>> df.plot.scatter(x='b', y='d', color='DarkGray', label='Group 4', ax=abcdac) #将上述3种关系的绘图嵌套到b列和d列的绘图关系中:ax=abcdac
>>> help(df.plot.scatter)
scatter(self, x, y, s=None, c=None, **kwds)
c参数表⽰的是点图的灰度⽔平,⽤0-1数值表⽰,1表⽰透明,0表⽰不透明,数值越⼤透明度越⾼,将数值写⼊单引号中;
The keyword c may be given as the name of a column to provide colors for each point
>>> df.plot.scatter(x='a', y='b', c='c', s=50) #c参数设定为df的第c列数值,表⽰的是绘制的点的灰度⽔平,同时灰度⽔平会出现⼀个灰度梯度标签表⽰不同的灰度级别。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论