-
pandas绘图
import matplotlib as mpl import matplotlib.pyplot as plt import pandas as pd import numpy as np # 解决坐标轴刻度负号乱码 plt.rcParams['axes.unicode_minus'] = False # 解决中文乱码问题 plt.rcParams['font.sans-serif'] = ['Simhei']
如果想利用 pandas 绘图,可使用 Series 或 DataFrame 对象,并利用 series.plot() 或 dataframe.plot() 进行绘图
-
1、Series.plot()
import pandas as pd series = pd.Series([2.5, 4.1, 2.7, 8.8, 1.0]) series.index.name='site' # series的索引会转化为横坐标,索引的标签会转化为横坐标的标签名 series.plot(kind="line",linestyle='-.', color='k', marker='o');
结果为:
import pandas as pd series = pd.Series([2.5, 4.1, 2.7, 8.8, 1.0]) series.index = ["a","b","c","d","e"] series.index.name = 'site' series.plot(kind="bar", fontsize=12);
结果为:
通过 series.plot() 中的 kind 参数,能画以下图:
- 'line' : 线图(默认)
- 'bar' : 垂直条形图
- 'barh' : 水平条形图
- 'hist' : 直方图
- 'box' : 箱型图
- 'kde' : 核密度估计图
- 'density' :与'kde'相同
- 'area' : 面积图
- 'pie' :饼图
-
2、dataframe.plot()
-
2.1 通过 kind 参数设置想要画图的类型
通过 dataframe.plot() 中的 kind 参数,可以绘制以下图:
- 'line' :线图(默认)
- ‘bar’ or ‘barh’ :柱状图、条型图
- ‘hist’ :频率柱状图(计算某些值出现的频率)
- ‘box’ :箱线图
- ‘kde’ or ‘density’ :密度图(需要scipy这个包)
- ‘area’ :区域图(不同区域的面积占比)
- ‘scatter’ :散点图 >>> plt.scatter(df['part A'], df['part B'])
- ‘hexbin’ : plt.hexbin(df['part A'], df['part B'], df['part C'])
- ‘pie’ :饼图,比较适合于 Series 对象,看不同的占比
dataframe = pd.DataFrame({'A':[9, 4, 4, 5, 7], 'B':[2, 4, 2, 8, 1]}) dataframe.index = ["一","二","三","四","五"]
dataframe.plot(kind="bar"); # dataframe.plot(subplots=True, sharex=True); # 画在多个子图当中
结果为:
dataframe = pd.DataFrame({'A':[9, 4, 4, 5, 7], 'B':[2, 4, 2, 8, 1]}) dataframe.plot(linestyle='dashed', color=['k','r'], marker='o', xticks=[0, 1, 2, 3, 4], yticks=np.arange(0, 10.0, 0.5), xlim=[-0.25, 4.25], title='dataframe photo');
结果为:
-
2.2 dataframe.plot.bar() 柱状图或条形图
dataframe = pd.DataFrame({'A':[9, 4, 4, 5, 7], 'B':[2, 4, 2, 8, 1]}) dataframe.index = ['once', 'twice', 'thrice', 'forth', 'fifth'] dataframe.plot.bar(); # 同 dataframe.plot(kind="bar"); # dataframe.plot(subplots=True, sharex=True);
结果为:
-
2.3 dataframe.plot.hist() 直方图
直方图(histogram)是一种可以对值频率进行离散化显示的柱状图,数据点被拆分到离散的、间隔均匀的面元中,绘制的是各面元中数据点的数量
dataframe.plot.hist(bins=20)
- bins=20表示数值分辨率,具体来说是将随机数设定一个范围
- 例如5.6,5.7,6.5,如果数值分辨率越低,则会将三个数分到5-7之间
- 如果数值分辨率越高,5.6,5.7将会分到5-6之间,而6.5将会分到6-7之间
import numpy as np a = np.random.randn(100) df = pd.DataFrame({'length':a }) df.plot.hist(bins=20);
结果为:
X 轴是 DataFrame 当中的数值分布,Y 轴是对应数值出现的次数
对多列数据画直方图:
# plt.figure() #表示设定绘制图标对象 df= pd.DataFrame({'a': np.random.randn(100) + 1, 'b': np.random.randn(100), 'c': np.random.randn(100) - 1}, index=range(1,101), columns=['a', 'b', 'c']) df.plot.hist();
结果为:
如果要用直方图只查看上面的 DataFrame 中的其中一个 Series(比如a) 的数据分布,"抽"这列出来即可:
df['a'].plot.hist(orientation='horizontal', cumulative=True); # 该图是将DataFrame对象当中的a进行数值累加,并绘制横向直方图,横轴表示频率(Frequency),纵轴表示数值 # cumulative=True的效果是将各Frequency的数值累加
结果为:
df.diff() 的效果是将 DataFrame 当中 column 分开,即将 a,b 和 c 分开绘制成三张图
例如:df.diff().hist() 可达到这个效果,即将所有 column 分开
df.diff().hist(color='k', alpha=0.5, bins=50);
结果为:
-
2.4 series.plot.box(),dataframe.plot.box() 箱线图
- 箱线图所表示的各个数值的含义:线条右下到上分别表示
- 最小值、第一四分位数、中位数、第三四分位数和最大值
- 第一四分位数(Q1),又称“较小四分位数”或“下四分位数”,等于该样本中所有数值由小到大排列后第25%的数字;
- 第二四分位数(Q2),又称“中位数”,等于该样本中所有数值由小到大排列后第50%的数字;
- 第三四分位数(Q3),又称“较大四分位数”或“上四分位数”,等于该样本中所有数值由小到大排列后第75%的数字;
- 第三四分位数与第一四分位数的差距又称四分位间距(InterQuartile Range,IQR)。
- 计算四分位数首先要确定Q1、Q2、Q3的位置(n表示数字的总个数):
- Q1的位置=(n+1)/4
- Q2的位置=(n+1)/2
- Q3的位置=3(n+1)/4
箱线图可以用如下方式绘制:
- series.plot.box()
- dataframe.plot.box()
- dataframe.boxplot()
np.random.seed(80) a = np.random.rand(10, 5) #np.random.rand产生的随机数都为0-1之间的正数 df = pd.DataFrame(a, columns=['A', 'B', 'C', 'D', 'E']) df.plot.box();
结果为:
- 修改箱线图线条颜色需要有以下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+'); #这里参数 sym 是设置离群值的样式,"r+"表示"红色,展示图形为+",类似可以设置为 "k*","bv" 等等
结果为:
#可绘制水平箱线图, positions 表示的意思是 ABCDE 这5个箱线图摆放位置,A在1位置,B在4位置,AB之间间隔2,3这两个位置 df.plot.box(vert=True, positions=[1, 4, 5, 6, 8], sym='k*');
结果为:
-
2.5 区域面积图(堆积折线图)
绘图方式:
- series.plot.area()
- dataframe.plot.area()
作用:相当于可以看到不同时刻的饼图占比情况
import pandas as pd np.random.seed(80) df = pd.DataFrame(np.random.rand(10, 4), columns=['a', 'b', 'c', 'd']) df.plot.area() #生成堆积图 df.plot.area(stacked=False); #非堆积效果图
结果为:
-
2.6 散点图
绘图方式:dataframe.plot.scatter()
import pandas as pd np.random.seed(80) 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轴数值绘制散点图
结果为:
df.plot.scatter(x='c', y='d', color='DarkBlue', label='Group 1'); #先设定第一个散点图,颜色为深蓝色标签为Group 1,以cd两列作为x及y轴的值
结果为:
如果有两组散点图,如何放在同一张图中作对比?
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='r', label='Group 2', ax=ax); #第二个散点图以cd两列作为x及y轴的值,颜色为深绿色标签为Group 2,ax=ax的作用是将ax这个图绘制到Group 2图片当中,形成两层图形嵌套关系
结果为:
-
2.7 饼图
绘图方式:
- series.plot.pie()
- dataframe.plot.pie()
import pandas as pd series = pd.Series(np.random.rand(4), index=['a', 'b', 'c', 'd'], name='series') series.plot.pie(figsize=(6, 6));
结果为:
df.plot.pie(y='x');
结果为:
df = pd.DataFrame(np.random.rand(4, 3), index=['a', 'b', 'c', 'd'], columns=['x', 'y', 'z']) df.plot.pie(subplots=True, figsize=(8, 4),); #df中三列数据通过subplots=True来设定画三个饼状子图
结果为: