参考书目:《深入浅出Pandas:利用Python进行数据处理与分析》
上一节讲解了pandas里面的对象的画图用法.plot()的参数。 这里是链接
本次继续了解pandas的各种图形的画法和参数用法,
pandas里面的图形类型有:
df.plot.line() # 折线的全写方式
df.plot.bar() # 柱状图
df.plot.barh() # 横向柱状图 (条形图)
df.plot.hist() # 直方图
df.plot.box() # 箱形图
df.plot.kde() # 核密度估计图
df.plot.density() # 同
df.plot.kde()
df.plot.area() # 面积图
df.plot.pie() # 饼图
df.plot.scatter() # 散点图
df.plot.hexbin() # 六边形箱体图,或简称六边形图
下面一一介绍画法,首先还是导入包和读取案例数据。
- import numpy as np
- import pandas as pd
- import matplotlib.pyplot as plt
- plt.rcParams ['font.sans-serif'] ='SimHei' #显示中文
- plt.rcParams ['axes.unicode_minus']=False #显示负号
- data = 'https://www.gairuo.com/file/data/dataset/team.xlsx'
- df = pd.read_excel(data)
基础用法
- df.plot()
- df.plot.line() # 全写方式
#基于以上的逻辑,如果希望指定指定列为 x 轴,可以先将其设为索引:
- (df.loc[:10] # 取部分
- .set_index('name') # 设为索引
- .plot() # 折线图
- )

其他参数
- #Series 索引为 x 轴,值为 y 轴, 值为非数字的会报错:
- df[:5].Q1.plot()
-
- #也可以指定 x 轴和 y 轴:
- df[:5].plot(x='name', y='Q1')
- df[:5].plot('name', ['Q1', 'Q2']) # 指定多条
子图
#如果一个折线图中有多条,可以使用 subplots 来将它们分开,形成多个子图。
df[:10].plot.line(subplots=True)

基础用法
- s = pd.Series(3 * np.random.rand(4),index=['a', 'b', 'c', 'd'], name='series')
- s.plot.pie(figsize=(6, 6))

#DataFrame 需要指定 y 值:
- df = pd.DataFrame(3 * np.random.rand(4, 2),index=['a', 'b', 'c', 'd'],columns=['x', 'y'])
- df.plot.pie(y='x')

子图
- #DataFrame 可以传入 subplots=True 创建子图矩阵:
- df.plot.pie(subplots=True, figsize=(8, 4))

图例
#默认是有图例的,但饼图一般可以不需要图例, legend=False:
df.plot.pie(subplots=True, figsize=(8, 4), legend=False)
#其他常用参数如下:
- s.plot.pie(labels=['AA', 'BB', 'CC', 'DD'], # 标签,指定项目名称
- colors=['r', 'g', 'b', 'c'], # 指定颜色
- autopct='%.2f', # 数字格式
- fontsize=20, # 字体大小
- figsize=(6, 6) # 图大小
- )
#基础用法
- #DataFrame 可以直接调用 plot.bar() 生成折线图,与折线图类似,x 轴为索引,其他数字类型的列为 y 轴上的条形。
-
- df.plot.bar()
- df.plot.barh() # 横向
- df[:5].plot.bar(x='name', y='Q4') # 指定xy轴
- df[:5].plot.bar('name', ['Q1', 'Q2']) # 指定xy轴
#基于以上的逻辑,如果希望指定指定列为 x 轴,可以先将其设为索引:
- (df.loc[:4] # 取部分
- .set_index('name') # 设为索引
- .plot
- .bar() # 柱状图
- )

#堆叠
- #可以将同一索引的多个数据堆叠起来:
- (df.loc[:4] # 取部分
- .set_index('name') # 设为索引
- .plot
- .bar(stacked=True) # 柱状图, 堆叠
- )
#可以方便看总分
#barh 横向
barh 可以将柱形横向,以下为一个横向+堆叠的例子:
- (
- df.loc[:5] # 取部分
- .set_index('name') # 设为索引
- .plot
- .barh(stacked=True) # 柱状图, 横向+堆叠
- )

#子图
- #和折线图一样,也支持子图:
- df[:5].plot.bar(subplots=True)
- plt.tight_layout()

基础用法
- df2=pd.DataFrame(10 * np.random.randn(200, 4),columns=list('ABCD'))
- df2.plot.hist(alpha=0.5)

#单个变量
df2.A.plot.hist()

#堆叠
- #可以堆叠,并指定分箱数量:
- df2.plot.hist(stacked=True, bins=20)

子图
#也可以直接使用 df.hist(alpha=0.5) 来绘制三个子图:
df2.hist(alpha=0.5)

#也可以单独绘制子图,指定分箱数量:
- df2.A.hist(bins=20, alpha=0.5)
- df2.hist('A', bins=20, alpha=0.5) # 同上

#by 参数可以做分组,生成分组后的子图:
- df.Q1.hist(by=df.team)
- plt.tight_layout()
#例子
#当我们绘制骰子6000次时,我们期望每个值大约获得1000次。 但是,当我们绘制两个骰子并将结果相加时,分布将完全不同。 直方图说明了这些分布:
- df = pd.DataFrame(np.random.randint(1, 7, 6000),columns = ['one'])
- df['two'] = df['one'] + np.random.randint(1, 7, 6000)
- df.plot.hist(bins=12, alpha=0.5) #一个是均匀分布 两个就是类似正态分布
#一个是均匀分布 两个就是类似正态分布
#基本用法
- df = pd.DataFrame(np.random.rand(10, 5), columns=['A', 'B', 'C', 'D', 'E'])
- df.plot.box() # 所有列
- df.A.plot.box() # 单个列
- df.boxplot() # 所有列
- df.boxplot('A') # 单个列

#子图
每条变量单独画一个箱线图
- df.plot.box(subplots=True)
- plt.tight_layout()

#配色
给图形中的一些元素指定颜色:
- color = {'boxes': 'DarkGreen', # 箱体颜色
- 'whiskers': 'DarkOrange', # 连线颜色
- 'medians': 'DarkBlue', # 中位数颜色
- 'caps': 'Gray'} # 极值颜色
- df.plot.box(color=color, sym='r+')

#其他参数
- #vert=False 将图形横向,positions 控制位置:
- df.plot.box(vert=False, positions=[1, 4, 5, 6, 8])

- df = pd.DataFrame(np.random.rand(10, 4), columns=['a', 'b', 'c', 'd'])
- df.a.plot.area() # 单个列
- df.plot.area()

#堆积
#要生成未堆积的图,请传入 stack = False,除非另有说明,否则Alpha值将设置为0.5。
df.plot.area(stacked=False)

#指定轴
- #可以指定 x 和 y 轴:
- df.plot.area(y='a')
- df.plot.area(y=['b', 'c'])
- df.plot.area(x='a')
基本用法
- df = pd.DataFrame(np.random.rand(50, 4), columns=['a', 'b', 'c', 'd'])
- df.plot.scatter(x='a', y='b')

#多组数据
- #要在单个轴上绘制多个列组,请重复指定目标轴的绘图方法。 建议指定颜色和标签关键字以区分每个组。
- ax = df.plot.scatter(x='a', y='b', color='DarkBlue', label='Group 1');
- df.plot.scatter(x='c', y='d', color='DarkGreen', label='Group 2', ax=ax);

#点的颜色
- #c 参数可以指定点的颜色。#c支持数组,s为点的size
- df.plot.scatter(x='a', y='b', c='c', s=50)

'''c 的取值可以是:
字符,RGB 或者 RGBA 码, 如 ‘red’ , ‘#a98d19’
序列,颜色列表,对应每个点的颜色
列名称或位置,其值将用于根据颜色图为标记点着色'''
- df.plot.scatter(x='a', y='b', c=['green','yellow']*25, s=50)
- df.plot.scatter(x='a', y='b', c='DarkBlue')
- df.plot.scatter(x='a', y='b', c='c', colormap='viridis')
第一条运行结果
#色阶栏
- #colorbar=True 在当前坐标区或图的右侧显示一个垂直颜色栏。颜色栏显示当前颜色图并指示数据值到颜色图的映射。
- df.plot.scatter(x='a', y='b', c='DarkBlue', colorbar=True)

#点大小
- #s 可以指定点的大小:
- df.plot.scatter(x='a', y='b', s=50) # 同样大小
- df.plot.scatter(x='a', y='b', s=df['c'] * 200) #用c来指定大小,类似气泡图

它是一种比较特殊的图表,既是散点图的延伸,又兼具直方图和热力图的特征。 如果数据过于密集而无法单独绘制每个点,则六边形图可以替代散点图。
- df = pd.DataFrame(np.random.randn(1000, 2), columns=['a', 'b'])
- df['b'] = df['b'] + np.arange(1000)
- df.plot.hexbin(x='a', y='b', gridsize=20)
- #gridsize。 它控制x方向上的六边形数量,默认为100。较大的网格尺寸意味着更多更小的箱体

差不多介绍完了,在实际做数据科学项目中,要注意分析的数据是做单变量还是多变量,以及如果是多变量的话,该怎么组合他们才能展示更好的效果。
一般常用的数据分析图形是柱状图,直方图和箱线图。当然还有小提琴图,不过那个需要别的库来画。
后面的面积图和六边形分相图不太常用。