在数据爆炸的时代,数据可视化已成为数据分析的关键环节。Python 作为强大的编程语言,拥有众多用于数据可视化的库,而 pandas 库在其中扮演着重要角色。它不仅能高效处理和分析数据,还具备强大的数据可视化功能,让我们轻松将枯燥的数据转化为直观、美观的图表。今天,就带大家深入了解 pandas 库的数据可视化技巧,开启数据可视化之路!
Pandas库可视化基础
pandas 库基于matplotlib构建,提供了简单易用的数据可视化接口。在使用前,需确保已安装 pandas 库和 matplotlib 库:
提前使用pip命令安装pandas和matplotlib库(使用阿里云镜像)
pip install pandas matplotlib -i https://mirrors.aliyun.com/pypi/simple/
通过import pandas as pd和import matplotlib.pyplot as plt导入这两个库,我们可以使用pandas库提供的plot方法将Series和DataFrame的数据进行可视化,生成多种图表(折线图,直方图,柱状图,箱型图,面积图,饼图,散点图,六边形箱体图等)。
plot方法介绍
Series和DataFrame对象都提供了plot方法,常使用两种调用方式:
1)通过df.plot.函数名调用,如下所示
-
折线图:df.plot.line()
-
柱状图:df.plot.bar()
-
水平柱状图:df.plot.barh()
-
直方图:df.plot.hist()
-
箱型图:df.plot.box()
-
面积图:df.plot.area()
-
饼图:df.plot.pie()
-
散点图:df.plot.scatter()
-
六边形箱体图:df.plot.hexbin()
-
通过df.plot调用,如下所示
df.plot(kind='line',title='line',x='name',y='math')
Plot参数如下:当数据为Series格式或DataFrame格式时,参数稍有不同;因为Series对象是一维数据,不需要传x轴和y轴的数据,相反DataFrame数据需要传x轴和y轴的数据
-
kind代表("line", "bar", "barh", "kde", "scatter", "area", "hist", "box",'hexbin')表示不同的图形,默认为line。
-
x:指定数据框的列作为x轴的值。如果不指定,则默认使用数据框的索引。
-
y:指定数据框的列作为y轴的值。如果不指定,则默认使用数据框的所有列(在绘制某些类型的图形时,如折线图,需要指定y轴)
-
ax:指定在哪个matplotlib的子图对象上绘制。如果不指定,则默认使用当前的子图。
-
subplots:指定是否使用子图进行绘制。False:不使用子图,所有列绘制在同一个图上。True:使用子图,每一列绘制在一个子图上。按照给定的分组绘制子图,例如[('a', 'c'), ('b', 'd')]会创建两个子图,一个包含列'a'和'c',另一个包含列'b'和'd'。
-
sharex:是否共享x轴。如果为True,会将一些x轴标签设为不可见。如果传入了ax参数,此设置可能会改变所有子图的x轴标签
-
sharey:是否共享y轴。如果为True,会将一些y轴标签设为不可见。
-
layout:指定子图的布局,例如(2, 3)表示两行三列。
-
figsize:指定画布的大小,例如(12, 8)表示12英寸宽8英寸高。
-
use_index:是否使用数据框的索引作为x轴的刻度。如果为False,则使用x参数指定的列作为x轴。
-
title:指定绘制的标题。如果是字符串,会打印在整个画布的顶部;如果是列表,并且subplots为True,会打印每个列表元素在对应的子图上方。
-
grid:是否显示网格线。
-
legend:是否显示图例。在每个子图上显示或反转顺序。
-
style:对每列折线图设置线的类型。
-
logx、logy、loglog:是否使用对数刻度。logx设置x轴刻度是否取对数,logy设置y轴刻度是否取对数,loglog同时设置x、y轴刻度是否取对数。
-
xticks、yticks:设置x轴、y轴的刻度值,序列形式(比如列表)。
-
xlim、ylim:设置坐标轴的范围,列表或元组形式。
-
rot:设置轴标签(轴刻度)的显示旋转度数。
-
fontsize:设置轴刻度的字体大小。
-
colormap:设置图的区域颜色。
-
colorbar:如果为True,则绘制颜色条(仅适用于'scatter'和'hexbin'图)。
-
xlabel和ylabel:设置x轴和y轴的标签,描述x轴和y轴的含义
以上函数调用后,我们需要配合使用matplotlib库帮助我们生成图表,使用如下代码
举例:准备一个DataFrame数据,我们用于生成不同的图表
import pandas as pd
import matplotlib.pyplot as plt
data_dict = {'group': ['A', 'B', 'C', 'D'],
'name': ['lilei', 'lili', 'wanglei', 'wangning'],
'math': [88, 75, 98,95],
'english': [94, 89, 90,87],
'yuwen': [90, 87, 89,91]}
df = pd.DataFrame(data_dict)
print(df)
结果:
折线图:df.plot.line()或df.plot(kind=line)
设置x轴为name列, y轴为math列,title=line设置标题,gtrd=True添加网格线,figsize=(4,3)设置画布大小。
df.plot(kind='line',title='line',x='name',y='math',grid=True,figsize=(4,3))
或者df.plot.line(title='line',x='name',y='math',grid=True,figsize=(4,3))
执行后图如下:
完整代码如下:
import matplotlib.pyplot as plt
import pandas as pd
data_dict = {'group': ['A', 'B', 'C', 'D'],
'name': ['lilei', 'lili', 'wanglei', 'wangning'],
'math': [88, 75, 98,95],
'english': [94, 89, 90,87],
'yuwen': [90, 87, 89,91]}
df = pd.DataFrame(data_dict)
df.plot(kind='line',title='line',x='name',y='math',grid=True,figsize=(4,3))
或者df.plot.line(title='line',x='name',y='math',grid=True,figsize=(4,3))
plt.show() #展示图形
除了开头介绍的plot对象的参数外,df.plot.line 常用的参数包括如下:
-
color:线条的颜色,可以是单个颜色值或颜色列表。
-
linestyle:线条的样式,例如 'solid'(实线,默认)、'dashed'(虚线)、'dotted'(点线)等
-
marker:数据点的标记样式,例如 'o'(圆形)、's'(方形)、'*'(星号)等。
-
alpha:线条的透明度,取值在 0 到 1 之间。
举例:增加上面一些参数后,重新执行(设置颜色为黑色,线条为虚线,数据点为方形)
df.plot.line(title='line',x='name',y='math',grid=True,figsize=(4,3),color='black',linestyle='dashed',marker='s')
举例:在折线图上显示数值
import pandas as pd
import matplotlib.pyplot as plt
# 创建示例数据
data = {'Year': [2015, 2016, 2017, 2018, 2019],
'Sales': [100, 150, 200, 180, 250]}
df = pd.DataFrame(data)
#绘制折线图:xticks=df['Year']表示x轴的刻度跟Year这一列保持一致
ax = df.plot.line(x='Year', y='Sales',xticks=df['Year'])
# 遍历数据点添加数值
for x, y in zip(df['Year'], df['Sales']):
plt.text(int(x), int(y), int(y))
# 显示图形
plt.show()
程序执行后,结果如下:
柱状图:df.plot.bar()或df.plot(kind=bar)
设置x轴为name列,其他三列作为y轴,并通过colormap='viridis'设置柱子的渐变颜色
df.plot.bar(x='name',y=['math','english','yuwen'],colormap='viridis')
执行后结果如下:
colormap 常见的颜色如下:
-
viridis:从感知较均匀的颜色,从深蓝色到黄色。
-
magma:从黑色到粉色到黄色的渐变。
-
plasma:从深紫色到黄色的渐变。
-
inferno:从黑色到橙色到黄色的渐变。
-
cividis:从感知上较均匀的颜色映射,对色盲比较友好。
-
Greys:灰度颜色映射。
-
Reds:从浅红色到深红色的渐变。
-
Blues:从浅蓝色到深蓝色的渐变。
-
Greens:从浅绿色到深绿色的渐变。
-
Oranges:从浅橙色到深橙色的渐变。
-
Purples:从浅紫色到深紫色的渐变。
除了开头介绍的plot对象的参数外,df.plot.bar 常用的参数包括:
-
color:设置柱形的颜色,可以是单个颜色值或颜色列表。
-
width:柱形的宽度。
-
alpha:柱形的透明度,取值在 0 到 1 之间。
举例:在柱状图上显示数值
import pandasaspd
importmatplotlib.pyplotasplt
# 创建示例数据
data={'Year':[2015,2016,2017,2018,2019],
'Sales':[100,150,200,180,250]}
df=pd.DataFrame(data)
# 绘制柱状图
ax=df.plot.bar(x='Year',y='Sales')
# 遍历数据点添加数值
for p in ax.patches:
ax.annotate(str(p.get_height()),(p.get_x()+p.get_width()/2,
p.get_height()),ha='center',va='center')
# 显示图形
plt.show()
程序执行后,结果如下:
水平柱状图:df.plot.barh()或df.plot(kind=barh)
设置subplots=True表示每一列使用一个子图,设置x轴为name列
df.plot.barh(x='name',subplots=True)
执行后如下:
df.plot.bar h常用的参数包括跟df.plot.bar的参数一致,参考如上介绍。
直方图:df.plot.hist()或者df.plot(kind=hist)
举例:设置一个DataFrame数据,包含某个value项目的数据统计,通过直方图展示。
import pandas as pd
import matplotlib.pyplot as plt
# 创建示例数据
data = {'value': [12, 25, 30, 18, 22, 35, 40, 28, 15, 20]}
df = pd.DataFrame(data)
# 使用 pandas 绘制直方图,配置一些其他参数:bins=3设置3个区间,color=green颜色设置为绿色,edgecolor='black'边框为黑色,xlabel='value',ylabel='count'设置x轴和y轴的标签。
df['Value'].plot.hist(title='Histogram',bins=3, color='green', edgecolor='black',xlabel='value',ylabel='count')
# 显示图形
plt.show()
执行后结果如下:
除了开头介绍的plot对象的参数外,df.plot.hist 常用的参数包括:
-
bins:指定直方图的区间数量。可以是一个整数,表示等宽的区间数量;也可以是一个序列,指定每个区间的边界。
-
color:直方图的颜色。
-
edgecolor:直方图边框的颜色。
-
alpha:直方图的透明度,取值在 0 到 1 之间。
-
grid:布尔值,决定是否显示网格线。
-
density:若为 True,则直方图的纵坐标显示概率密度;若为 False(默认),则显示频数。
-
range:指定数据的范围,以元组形式给出 (min, max) 。
-
histtype:直方图的类型,比如 'bar'(默认,垂直条形)、'barstacked'(堆叠垂直条形)、'step'(阶梯状)、'stepfilled'(填充的阶梯状) 。
饼图:df.plot.pie()或df.plot(kind=pie)
举例:设置一个DataFrame数据,包含某个项目的子项目完成进度的个数统计,通过饼图展示。
import pandas as pd
import matplotlib.pyplot as plt
# 创建示例数据
data = {'result': ['Not started','in progress','completed'],
'count':[5,10,8]}
df = pd.DataFrame(data)
# 使用 pandas 绘制饼图
#将count列作为统计数据,标签labels使用result列,
#autopct展示每个饼图区域的百分比,%1.2f%表示保留2位小数
df.plot.pie(y='count',labels=df['result'],autopct='%1.2f%')
# 显示图形
plt.show()
运行后结果如下:
除了开头介绍的plot对象的参数外,df.plot.pie一些 常用的参数包括:
-
y:指定用于绘制饼图的数据列。
-
labels:指定每个扇区对应的标签。
-
colors:指定扇区的颜色,可以是单个颜色值或颜色列表。
-
explode:设置扇区的偏移程度,通常是一个与数据长度相同的小数列表,用于突出显示某些扇区。
-
shadow:布尔值,决定是否添加阴影效果,使饼图更具立体感。
-
startangle:指定起始角度,默认为 0 度,从 x 轴正方向开始。
-
autopct:用于在扇区上显示百分比格式的数值,例如 '%1.1f%%' 表示保留一位小数的百分比。
-
radius:设置饼图的半径大小。
面积图:df.plot.area()或df.plot(kind=area)
举例:设置一个DataFrame数据,表示某个项目的子项目完成进度的个数统计,通过面积图展示。
import pandas as pd
import matplotlib.pyplot as plt
# 创建示例数据
data = {'result': ['Not started','in progress','completed'],
'count':[5,10,8]}
df = pd.DataFrame(data)
# 使用 pandas 绘制面积图
#将count列作为y轴,result列作为x轴
df.plot.area(x='result',y='count',stacked=False,color='blue')
# 显示图形
plt.show()
运行后结果如下:
除了开头介绍的plot对象的参数外,df.plot.area 用于绘制面积图,以下是一些常用参数:
-
stacked:布尔值,决定是否堆叠面积。如果为 True,则各区域会堆叠显示;如果为 False,则区域会相互覆盖。
-
color:指定图形的颜色,可以是单个颜色值或颜色列表。
-
alpha:设置图形的透明度,取值在 0(完全透明)到 1(完全不透明)之间。
散点图:df.plot.scatter()或df.plot(kind=scatter)
举例:设置一个DataFrame数据,包含x轴和y轴的一些数字,通过散点图展示。
import pandas as pd
import matplotlib.pyplot as plt
# 创建示例数据
data = {'X': [1, 2, 3, 4, 5],
'Y': [2, 4, 6, 8, 10],
'Size': [100, 200, 150, 300, 250],
'Color': ['red', 'blue', 'green', 'yellow', 'purple']}
df = pd.DataFrame(data)
# 绘制散点图
df.plot.scatter(x='X', y='Y', s=df['Size'],
c=df['Color'], marker='o', alpha=0.7)
# 显示图形
plt.show()
运行后结果如下:
除了开头介绍的plot对象的参数外,df.plot.scatter 常用的参数包括:
-
s:控制点的大小,可以是一个固定值或者一个与数据长度相同的数组来为每个点设置不同的大小。
-
c:控制点的颜色,可以是一个固定的颜色值,也可以是一个与数据长度相同的数组来为每个点设置不同的颜色。
-
marker:点的标记样式,例如 'o'(圆形)、's'(方形)、'*'(星号)等。
-
alpha:点的透明度,取值在 0(完全透明)到 1(完全不透明)之间。
-
edgecolors:点的边缘颜色。
-
linewidths:点的边缘线宽。
箱型图:df.plot.box()或df.plot(kind=box)
举例:设置一个DataFrame数据,表示股票在K线图中的最高价(High Price)、最低价(Low Price)、收盘价(Close Price)和开盘价(Open Price),通过箱体图展示。
import pandas as pd
import matplotlib.pyplot as plt
# 创建示例数据
data = {'type': ['High Price','Open Price'
,'Low Price','Close Price'],
'price':[10.22,9.99,9.78,10.10]}
df = pd.DataFrame(data)
# 使用 pandas 绘制箱体图
#将'price'列作为y轴
df.plot.box(column='price')
# 显示图形
plt.show()
运行后结果如下:
除了开头介绍的plot对象的参数外,df.plot.box 的一些常用参数:
-
column:指定要绘制箱线图的数据列名。
-
by:用于分组的列名,以便为不同的组绘制单独的箱线图。
-
color:箱线图的颜色。
-
sym:异常值的标记样式。
-
vert:布尔值,决定箱线图是垂直绘制(True,默认)还是水平绘制(False)。
-
widths:箱线图的宽度。
-
notch:布尔值,如果为 True,则绘制带缺口的箱线图。
-
patch_artist:布尔值,如果为 True,则用填充的方式绘制箱体。
六边形箱体图:df.plot.hexbin()或df.plot(kind=hexbin)
举例:设置一个DataFrame数据,随机生成数量一致的x轴和y轴的数据,通过六边形箱体图展示。
import pandas as pd
import matplotlib.pyplot as plt
import random
# 创建示例数据
x = [random.randint(0,100) for i in range(20)]
y = [random.randint(0,100) for i in range(20)]
df = pd.DataFrame({'X': x, 'Y': y})
# 绘制六边形箱体图
df.plot.hexbin(x='X', y='Y', gridsize=20, color='k')
# 显示图形
plt.show()
运行后结果如下:
除了开头介绍的plot对象的参数外,df.plot.hexbin 用于绘制六边形分箱图。以下是一些常用参数:
-
gridsize:控制六边形网格的大小。较小的值会产生更多、更精细的六边形。
-
C:可以指定与每个点相关的值,用于给六边形着色。
-
reduce_C_function:用于聚合 C 值的函数,例如 np.mean(默认)、np.sum 等。
-
mincnt:六边形中包含的最小点数,少于这个点数的六边形不会被绘制。
-
xscale、yscale:控制 X 轴和 Y 轴的缩放,例如 'linear'(默认)、'log' 等。
-
color:六边形的颜色。
-
cmap:颜色映射(Color Map),用于根据 C 值进行颜色映射。
大家注意了,以上图表暂不支持中文(中文会有乱码),如果需要中文可能要再继续探索下了。
共勉: 东汉·班固《汉书·枚乘传》:“泰山之管穿石,单极之绠断干。水非石之钻,索非木之锯,渐靡使之然也。”
-----指水滴不断地滴,可以滴穿石头;
-----比喻坚持不懈,集细微的力量也能成就难能的功劳。
----感谢读者的阅读和学习,谢谢大家。