发布时间:2024-04-07 13:01
参考书目:《深入浅出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。较大的网格尺寸意味着更多更小的箱体
差不多介绍完了,在实际做数据科学项目中,要注意分析的数据是做单变量还是多变量,以及如果是多变量的话,该怎么组合他们才能展示更好的效果。
一般常用的数据分析图形是柱状图,直方图和箱线图。当然还有小提琴图,不过那个需要别的库来画。
后面的面积图和六边形分相图不太常用。