Matplotlib
Matplotlib是⼀个Python 2D绘图库,与numpy、pandas共享数据科学三剑客的美誉,也是很多⾼级可视化库的基础。
从简单的折线图到复杂的三维图或者是符合图,matplotlib都可以完成。在科学计算里,常见的图有以下这些:
名称 | 使用场景 |
---|---|
折线图 | 展示数据随时间的变化趋势。<br /> 比较多个数据系列的变化趋势。 <br />适合连续数据。 |
柱状图 | 比较不同类别的数据量。 <br />展示分类数据的分布。 <br />适合离散数据 |
直方图 | 展示数据的分布情况。<br />适合连续数据。 |
饼图 | 展示各部分在整体中所占的比例。 <br />适合分类数据,且类别不多。 |
散点图 | 展示两个变量之间的关系。<br /> 识别数据的模式和趋势。 <br />适合连续数据。 |
箱线图 | 展示数据的分布情况,<br />特别是中位数、四分位数和异常值。 |<br />适合连续数据。 |
热力图 | 展示二维数据矩阵。 <br />适合大量数据的可视化。 |
雷达图 | 展示多维度数据的比较。 <br />适合分类数据。 |
气泡图 | 展示三个变量之间的关系。 <br />适合连续数据。 |
地图 | 展示地理数据的分布。<br />适合地理位置相关的数据。 |
饼图堆叠柱状图 | 展示多个类别在总体中的贡献。<br /> 适合分类数据。 |
南丁格尔玫瑰图 | 展示多维度数据的比较,类似于雷达图,但以圆形布局。 <br />适合分类数据。 |
下面通过示例了解matplotlib的使用
折线图
from matplotlib import pyplot as plt
months = ['January','February','March','April','May','June','July','August','September','October','November','December']
xiaoshoue = [300,240,270,310,300,350,310,316,323,307,420,370]
# 设置字体
plt.rcParams['font.family'] = 'SimHei' # windows系统-- SimHei
plt.rcParams['font.size'] = 11
# 指定画布大小
plt.figure(figsize=(12,4),dpi=100,facecolor='yellow')
# <dots per inch> 每英寸的像素点数
# 引入折线图的方法
plt.plot(
months, # X轴数据
xiaoshoue, # Y轴数据
marker='o', # 标点的形状
markerfacecolor='yellow', # 标点的颜色
markeredgecolor='red', # 标点边框的颜色
markersize='10', # 标点大小
linestyle='-.', # 线段样式
color = 'red', # 线段的颜色
linewidth = 2, # 也可以用lw = 2, 线段的粗细
alpha = 0.5 # 线段的透明度 0-1 之间
)
# x轴的标签
plt.xlabel('月份')
# y轴的标签
plt.ylabel('销量/万')
# 标题
plt.title('全年销售趋势-折线图')
# 网格
plt.grid(color='gray',linestyle=':',alpha=0.5,linewidth=1)
# 图片的保存
plt.savefig('全年销售趋势-折线图.png')
# 显示 pycharm 中 必须要要写显示方法
plt.show()
柱状图
months = ['January','February','March','April','May','June','July','August','September','October','November','December']
xiaoshoue = [300,240,270,310,300,350,310,316,323,307,420,370]
# 指定画布大小
plt.figure(figsize=(12,4),dpi=100,facecolor='blue')
plt.bar(months,xiaoshoue,width=0.5)
plt.show()
水平条形图
months = ['January','February','March','April','May','June','July','August','September','October','November','December']
xiaoshoue = [300,240,270,310,300,350,310,316,323,307,420,370]
# 指定画布大小
plt.figure(figsize=(12,4),dpi=100,facecolor='blue')
plt.barh(months,xiaoshoue)
plt.show()
散点图
months = ['January','February','March','April','May','June','July','August','September','October','November','December']
xiaoshoue = [300,240,270,310,300,350,310,316,323,307,420,370]
# 指定画布大小
plt.figure(figsize=(12,4),dpi=100,facecolor='blue')
plt.scatter(months,xiaoshoue)
plt.show()
直方图
from matplotlib import pyplot as plt
import numpy as np
data = np.random.randn(10000)
plt.figure(figsize=(8,4),dpi=100,facecolor=(0.5,1,0))
plt.hist(data,bins=100,color='blue',label='随机数')
plt.show()
图表与子图
在个别场景下,需要一些复合图表,如两条曲线的趋势走向在同一个坐标轴里显示,这样可以直观观察两条曲线的客观关系或者映射关系。在matplotlib里,一份数据展示一个图表,如果要在一个图表里展示两份数据的分布关系,则是通过子图实现。plt.subplots()用于创建包含多个子图的图形布局。它允许在一个图形窗口中组织和排列多个图表,非常适合用于数据可视化和科学绘图。
而更直观的图标关系除了多个子表展示外,还有单轴图变双轴或者四轴图
示例:
多子图
e.g:
# 创建新的图表
fig,axl = plt.subplots(nrows=2,ncols=2)
plt.show()
双y轴图
from matplotlib import pyplot as plt
fig, ax = plt.subplots(nrows, ncols, figsize=(width, height))
- fig:返回的Figure对象,代表整个图形
- ax:返回的Axes对象或Axes对象的数组,代表子图
- nrows:子图的行数
- ncols:子图的列数
- figsize:整个图形的大小,以英寸为单位
e.g:
#两份数据,一份是年份和对应的逾期率,一份是年份和对应的金额
年份 = [2015, 2016, 2017, 2018, 2019, 2020, 2021, 2022, 2023]
逾期率 = [0.0136, 0.0135, 0.0125, 0.0118, 0.0147, 0.0108, 0.0101, 0.0098, 0.0123]
金额 = [388.8, 406.6, 459.7, 788.6, 837.9, 838.6, 858.6, 917.1, 990.04]
#两份数据,使用一个图表,一份主图和一份子表
# 创建新的图表
_,axl = plt.subplots(figsize=(12,4))
# 绘制逾期率的折线图
axl.plot(年份,逾期率,'b-o',label='逾期率')
"""
b-o
b 代表的是颜色
- 代表的是线条的样式
o 代表的是标点的形状
"""
axl.set_xlabel('年份')
axl.set_ylabel('逾期率',color='b')
# 创建右边的y轴
raxl= axl.twinx()
# 绘制金额的折线图
raxl.plot(年份,金额,'g:^',label='金额')
raxl.set_ylabel('逾期金额/亿元',color='g')
# 为每一个标点添加上数据标注
for i in range(len(年份)):
axl.text(年份[i],逾期率[i],f'{逾期率[i]*100:.2f}%',color='b',ha='left')
raxl.text(年份[i],金额[i],f'{金额[i]:.2f}亿',color='g',ha='right')
# 标题
plt.title('2015-2023年信用卡逾期数据')
# 网格
plt.grid(color='gray',linestyle=':',alpha=0.5,linewidth=1)
# 添加图例
lines1, aaa = axl.get_legend_handles_labels()
lines2, bbb = raxl.get_legend_handles_labels()
axl.legend(lines1+lines2, aaa+bbb, loc='upper left')
plt.show()
饼图
import matplotlib.pyplot as plt
x = [0.25,0.25,0.25,0.1,0.15]
y = ['A','B','C','D','E']
plt.pie(
x=x,
labels=y,
autopct='%1.1f%%', # 第一个%声明的是格式化输出 1 只少有一位 .1f %%
pctdistance=0.8,
)
plt.show()
seaborn
matplotlib与seaborn对比:
美观
Matplotlib:默认样式较为普通,但通过自定义可以创造出高度个性化的图表。
Seaborn:内置多种美观的颜色主题和绘图样式,可以快速生成视觉吸引力强的图表。易用性
Matplotlib:较为复杂和冗长的语法,需要编写更多的代码来绘制同样效果的图表。
Seaborn:简化了Matplotlib的操作,使得代码更简洁,一行代码便能实现一个清晰好看的可视化输出。可拓展性
Matplotlib:提供灵活的绘图控制选项,用户可以自定义图表的各个方面,如大小、颜色、字体等。
Seaborn:虽然简化了绘图过程,但在一些复杂的定制化需求上可能不如Matplotlib灵活。数据处理
Matplotlib:有效地处理数据框和数组,将图形和轴视为对象。
Seaborn:更适合处理Pandas数据帧,通常将整个数据集视为一个单元进行操作。
seaborn支持画图类型有茫茫多,详情可以参考官网:https://seaborn.pydata.org/examples/index.html
这里只示例常用的几种
散点图
e.g:
import seaborn as sns
import pandas as pd
from matplotlib import pyplot as plt
# 这里读取的是本地的csv文件获取展示数据,数据不重要,任意构造也可以
iris = pd.read_csv(r'iris.csv')
#画图准备
plt.figure(figsize=(10,5))
# seaborn里的散点图函数,x轴,y轴,data 引入二维表格对象,hue 指分类字段,可以自行了解函数,参数也很多
sns.scatterplot(x='sepal_length',y='sepal_width',data=iris,hue='species')
plt.show()
箱型图
import seaborn as sns
import pandas as pd
from matplotlib import pyplot as plt
# 这里读取的是本地的csv文件获取展示数据,数据不重要,任意构造也可以
iris = pd.read_csv(r'iris.csv')
#画图准备
plt.figure(figsize=(10,5))
# seaborn里的散点图函数,x轴,y轴,data 引入二维表格对象,hue 指分类字段,可以自行了解函数,参数也很多
sns.boxplot(x='sepal_length',y='sepal_width',data=iris,hue='species')
plt.show()
直方图
import seaborn as sns
import pandas as pd
from matplotlib import pyplot as plt
iris = pd.read_csv(r'iris.csv')
plt.figure(figsize=(10,5))
# x指定花萼的长度字段,y指定花萼宽度的字段,data 引入二维表格对象,hue 指明鸢尾花的物种进行分类
sns.histplot(x='sepal_length',y='sepal_width',data=iris,hue='species')
plt.show()
成对图
import seaborn as sns
import pandas as pd
from matplotlib import pyplot as plt
iris = pd.read_csv(r'iris.csv')
plt.figure(figsize=(10,5))
# x指定花萼的长度字段,y指定花萼宽度的字段,data 引入二维表格对象,hue 指明鸢尾花的物种进行分类
sns.pairplot(data=iris,hue='species')
plt.show()
热力图
import seaborn as sns
import pandas as pd
from matplotlib import pyplot as plt
iris = pd.read_csv(r'iris.csv')
plt.figure(figsize=(10,5))
# 热力图只能针对数字类型,在本地数据里有字符串列,需要切片排除掉
my_data = iris.iloc[:,0:-1].corr()
sns.heatmap(data=my_data)
plt.show()