Matplotlib 可视化 / pandas 绘图 / Seaborn 绘图

Matplotlib 可视化

入门演示

matplotlib 的绘图基本步骤:

  1. 创建画布
  2. 准备数据集,X轴,Y轴
  3. 可选:颜色,线型,标签,网格,图例,标题,坐标轴标签。
  4. 绘制图像
py 复制代码
import matplotlib.pyplot as plt
# 创建一个10英寸的宽和5英寸的高的画布
# dpi 点数 80,表示清晰度。
# 10 * 80,5 * 80
plt.figure(figsize=(10, 5), dpi=80)

# 准备数据
x = [1, 2, 3, 4, 5, 6, 7]
y = [6, 2, 10, 14, 21, 25, 30]

# 准备绘制
plt.plot(x, y) # 折线图

# 展示图
plt.show()

设置刻度尺,配置中文

py 复制代码
import matplotlib.pyplot as plt
# 设置中文
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False

通过 plt.xticksplt.yticks 设置对应的刻度尺

py 复制代码
# 返回一个迭代对象,0 - 60,这是 X轴
x = range(60)

# y 轴,范围 15 ~ 18
y = [random.uniform(15, 18) for i in x]

# 创建画布
plt.figure(figsize=(10, 5), dpi=80)

# 绘制图像
plt.plot(x, y)

# 自定义X轴和Y轴
x_ticks_label = [f'11点{i}分' for i in x]
y_ticks_label = [i for i in range(0, 25)]

# 具体设置,但是如果不切片,那会显得很密集,所以需要切片,注意必须都切片
plt.xticks(x[::5], x_ticks_label[::5])
plt.yticks(y_ticks_label[::5])

# 显示
plt.show()

添加网格,标题

主要实现plt.grid

  • linestyle:设置线风格。
    • (-)实线
    • (--)虚线
    • (-.)一个杠一个.
    • (:)两个点
    • (' ')留空、空格
  • alpha:设置透明度,最大1,最小0

设置标题 / 保存为图片

  • xlabel
  • ylabel
  • title
  • savefig
py 复制代码
import matplotlib.pyplot as plt
import random
x = range(60)
y = [random.uniform(15, 18) for i in x]
plt.figure(figsize=(10, 5), dpi=80)
plt.plot(x, y)

# 自定义X轴和Y轴
x_ticks_label = [f'11点{i}分' for i in x]
y_ticks_label = [i for i in range(0, 25)]

plt.xticks(x[::5], x_ticks_label[::5])
plt.yticks(y_ticks_label[::5])

# 添加网格
plt.grid(linestyle=':', alpha=1)

# 添加标签
plt.xlabel('时间', fontsize=15)
plt.ylabel('温度', fontsize=15)
# 添加标题
plt.title('温度变化曲线', fontsize=20)

plt.savefig('temp.png')

plt.show()

一张图绘制多个 / 增加图例

绘制多个图的关键点,给每个plot要加一个label,表示名字,后续图例使用。

  • color 用于设置颜色,生成的图例有颜色。
  • label 文字
py 复制代码
# 准备数据
x = range(60)
# 第一个图的数据
y = [random.uniform(15, 18) for i in x]
# 第二个图的数据
m = [random.uniform(1, 10) for i in x]
plt.figure(figsize=(10, 5), dpi=80)

# 绘制第一个线
plt.plot(x, y, label='北京')
# 绘制第二个线
plt.plot(x, m, label='摩诃')
颜色字符 风格字符
r 红色 - 实线
g 绿色 - - 虚线
b 蓝色 -. 点划线
w 白色 : 点虚线
c 青色 ' ' 留空、空格
m 洋红
y 黄色
k 黑色

加图例的关键代码,loc 设置 best,表示自动匹配最好的位置。这个 loc 会根据 label 来匹配,如果在绘制时没设置 label,不会生成的。

  • loc 设置图例位置
py 复制代码
# 增加图例
plt.legend(loc='best')

设置位置

位置 string 位置代码
'best' 0
'upper right' 1
'upper left' 2
'lower left' 3
'lower right' 4
'right' 5
'center left' 6
'center right' 7
'lower center' 8
'upper center' 9
'center' 10

完整代码演示

py 复制代码
import matplotlib.pyplot as plt
import random
# 准备数据
x = range(60)
# 第一个图的数据
y = [random.uniform(15, 18) for i in x]
# 第二个图的数据
m = [random.uniform(1, 10) for i in x]
plt.figure(figsize=(10, 5), dpi=80)

# 绘制第一个线
plt.plot(x, y, label='北京', color='r')
# 绘制第二个线
plt.plot(x, m, label='摩诃', color='c')

# 增加图例
plt.legend(loc='best')

x_ticks_label = [f'11点{i}分' for i in x]
y_ticks_label = [i for i in range(0, 25)]
plt.xticks(x[::5], x_ticks_label[::5])
plt.yticks(y_ticks_label[::5])
plt.grid(linestyle=':', alpha=1)
plt.xlabel('时间', fontsize=15)
plt.ylabel('温度', fontsize=15)
plt.title('温度变化曲线', fontsize=20)
plt.show()

多个坐标系,在一个画布

主要是通过下面,获取到了分割后的画布,对每个画布进行单独设置。

py 复制代码
fig, ax = plt.subplots(figsize=(20, 8), nrows=1, ncols=2)

完整代码

py 复制代码
import matplotlib.pyplot as plt
import random
# 准备数据
x = range(60)
y = [random.uniform(15, 18) for i in x]
m = [random.uniform(1, 10) for i in x]

# 面向对象绘图,fig -> 画布(1行2列的画布),ax -> 坐标系
fig, ax = plt.subplots(figsize=(20, 8), nrows=1, ncols=2)

# 绘制图像
ax[0].plot(x, y, color='r', label='北京')
ax[1].plot(x, m, color='c', label='摩诃')

# 添加刻度
# 刻度变量
x_ticks_label = [f'11点{i}分' for i in x]
y_ticks_label = [i for i in range(0, 25)]

# 具体添加刻度的操作
ax[0].set_xticks(x[::5])  # 图 1 的 x轴
ax[0].set_yticks(y_ticks_label[::5])  # 图 1 的 y轴
ax[0].set_xticklabels(x_ticks_label[::5])  # 图 1 的 x轴的值

# 具体添加刻度的操作
ax[1].set_xticks(x[::5])  # 图 1 的 x轴
ax[1].set_yticks(y_ticks_label[::5])  # 图 1 的 y轴
ax[1].set_xticklabels(x_ticks_label[::5])  # 图 1 的 x轴的值
plt.show()

目前是这样,我们继续添加

设置 x y 轴的标题和大小

py 复制代码
ax[0].set_ylabel('温度')
ax[0].set_xlabel('时间')
ax[0].set_title('一段时间的温度变化', fontsize=20)

ax[1].set_ylabel('温度')
ax[1].set_xlabel('时间')
ax[1].set_title('一段时间的温度变化', fontsize=20)


# 添加图例
ax[0].legend(loc='best')
ax[1].legend(loc=0)

# 保存图片
plt.savefig('test.png')

plt.show()

其他图像绘制

matplotlib.org/stable/gall... 官方案例库

  • 折线图用来看趋势
  • 柱状图用来看对比
  • 直方图用来展示数据的分布情况
  • 散点图用来描述两个连续变量之间的关系

绘制柱状图

py 复制代码
import matplotlib.pyplot as plt
# 1. 准备数据
x = ['A', 'B', 'C', 'D', 'E']
y = [3, 6, 1, 8, 2]

# 额外可以设置画布大小
plt.figure(figsize=(20,8))

# 2. 绘制柱状图
plt.bar(x, y, color='r')

# 3. 设置 x轴,y轴标签 和标题
plt.xlabel('分类名')
plt.ylabel('商品个数')
plt.title('商品分类统计图', fontsize=15)
plt.show()

绘制直方图

由一系列高度不等的纵向条纹或线段表示数据分布的情况。 一般用横轴表示数据范围,纵轴表示分布情况。

特点:绘制连续性的数据展示一组或者多组数据的分布状况(统计)

py 复制代码
import matplotlib.pyplot as plt
import numpy as np
# 1. 准备数据
data = np.random.randn(500)

# 2. 创建面板
plt.figure(figsize=(20, 8))

# 3. 绘制图形,rwidth 柱子之间的宽度,bins 柱子大小
plt.hist(data, bins=20, color='r', alpha=0.5, rwidth=0.8)

# 4. 显示
plt.show()

绘制饼图

py 复制代码
import matplotlib.pyplot as plt
# 准备数据
sizes = [25, 35, 25, 15]
# 分类标签
labels = ['电脑', '手机', '键盘', '鼠标']

# 就提绘图动作, autopct 显示百分比
plt.pie(sizes, labels=labels, autopct='%1.1f%%')
# 设置图表标题
plt.title("Simple Pie Chart")
plt.show()

散点图

py 复制代码
import matplotlib.pyplot as plt

x = [1, 2, 3, 4, 5]
y = [2, 3, 5, 7, 11]

plt.scatter(x, y, color='red')  # 绘制红色散点图
plt.title("Simple Scatter Plot")  # 设置图表标题
plt.xlabel("X-axis")  # 设置X轴标签
plt.ylabel("Y-axis")  # 设置Y轴标签
plt.show()  # 显示图表

pandas 绘图

要统计个数的两种方式

py 复制代码
# 思路一:稍微复杂一点
# df.groupby('province')['province'].count().sort_values(ascending=False).head(10)
df['province'].value_counts()

柱状图

py 复制代码
df['province'].value_counts().head(10).plot.bar(fontsize=15, figsize=(10,6), color=['r', 'g', 'b', 'y', 'c', 'm', 'k', 'pink', 'gray', 'orange'])

面积图

py 复制代码
kwords = dict(fontsize=15, figsize=(10, 6), color=['r', 'g', 'b', 'y', 'c', 'm', 'k', 'pink', 'gray', 'orange'])
df['province'].value_counts().head(10).plot.area(**kwords)

案例

获取产葡萄酒最多的10个产地的 占比

py 复制代码
kwords = dict(fontsize=15, figsize=(10, 6), color=['r', 'g', 'b', 'y', 'c', 'm', 'k', 'pink', 'gray', 'orange'])
(df['province'].value_counts().head(10) / len(df)).plot.bar(**kwords)

展示每个评分的葡萄酒种类(个数)

py 复制代码
kwords = dict(fontsize=15, figsize=(10, 6), color=['r', 'g', 'b', 'y', 'c', 'm', 'k', 'pink', 'gray', 'orange'])
df['points'].value_counts().sort_index().plot.bar(**kwords) # 柱状图
df['points'].value_counts().sort_index().plot.area(**kwords) # 面积图
df['points'].value_counts().sort_index().plot.line(**kwords) # 折线图

Seaborn 绘图

底层依赖 Matplotlib

bash 复制代码
pip install seaborn

已知数据

柱状图

按照性别,进行统计

  • x 是绘制的列名
  • hue 是分组的名字
py 复制代码
import seaborn as sns
# 联网加载数据集
df = sns.load_dataset('tips')
# 按照性别字段进行统计
sns.countplot(data=df, x='sex')
sns.countplot(data=df, x='day', hue='sex')

绘制直方图

py 复制代码
import seaborn as sns
# 联网加载数据集
df = sns.load_dataset('tips')
sns.histplot(data=df, x='total_bill', hue='sex')

如何修改画布大小和标题

py 复制代码
import seaborn as sns
import matplotlib.pyplot as plt
# 设置乱码
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False

fig, ax = plt.subplots(figsize=(10, 6))
sns.histplot(data=df, x='total_bill', hue='sex')
ax.set_title('男女总账单分布情况', fontsize=20)
plt.show()

案例

需求:描述总账单金额和小费的分布情况(散点图,关系图)

py 复制代码
import seaborn as sns
import matplotlib.pyplot as plt

plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False

fig, ax = plt.subplots(figsize=(10, 6))
# x轴。总账单,y轴,消费,按照性别分组
sns.scatterplot(data=df, x='total_bill', y='tip', hue='sex')
ax.set_title('总账单金额和小费的关系图', fontsize=20)
plt.show()

还有其他方式绘制出,散点图,它不能使用分组

py 复制代码
# 拟合回归线
sns.regplot(data=df, x='total_bill', y='tip')

还有一种方式,带上直方图的散点图,注意它不需要和上面代码混合在一起,它自带画布等

py 复制代码
import seaborn as sns
import matplotlib.pyplot as plt

sns.jointplot(data=df, x='total_bill', y='tip')
plt.show()

它如果加上,分组,会使用折线图,而不是直方图

py 复制代码
sns.jointplot(data=df, x='total_bill', y='tip', hue='sex')
plt.show()

加上 kind = red,使用正态分布,它不允许与 hue 分组一起使用

py 复制代码
sns.jointplot(data=df, x='total_bill', y='tip', kind='reg')
plt.show()

还可以变成,蜂巢图

py 复制代码
sns.jointplot(data=df, x='total_bill', y='tip', kind='hex')
plt.show()

箱线图 / 何须图

  • Q3:四分之三
  • 中位数:二分之一
  • q1:四分之一
py 复制代码
import seaborn as sns
import matplotlib.pyplot as plt
# 联网加载数据集
df = sns.load_dataset('tips')
# 线箱图
sns.boxplot(data=df, x='time', y='total_bill')
plt.show()

小提琴图

py 复制代码
import seaborn as sns
import matplotlib.pyplot as plt
# 联网加载数据集
df = sns.load_dataset('tips')
sns.violinplot(data=df, x='time', y='total_bill')
plt.show()

希望分组,使用 hue

py 复制代码
sns.violinplot(data=df, x='time', y='total_bill', hue='sex')

希望切割,使用 split

py 复制代码
sns.violinplot(data=df, x='time', y='total_bill', hue='sex', split=True)
相关推荐
shenzhenNBA2 小时前
如何在python项目中使用日志功能?通用版本
java·开发语言·python·日志·log
IT·小灰灰2 小时前
Doubao-Seedream-4.5:当AI学会“版式设计思维“——设计师的七种新武器
javascript·网络·人工智能·python·深度学习·生成对抗网络·云计算
秋刀鱼 ..2 小时前
第五届计算机、物联网与控制工程国际学术会议(CITCE 2025)
人工智能·python·物联网·机器人·制造·新人首发
CodeCraft Studio2 小时前
国产化Word处理组件Spire.DOC教程:通过Python将HTML转换为TXT文本
python·html·word·python编程·spire.doc·html转txt
DreamNotOver2 小时前
在 VS Code 中使用 Conda虚拟环境高效运行与调试 Django 单元测试
python·django·conda
我会一直在的2 小时前
Appium的基础API介绍
python·appium·自动化
凌盛羽2 小时前
用Python非常流行的openpyxl库对Excel(.xlsx格式)文件进行创建、读取、写入、显示等操作
数据库·python·链表·excel
编织幻境的妖2 小时前
Python对象序列化和反序列化方法总结
开发语言·python
Cherry的跨界思维2 小时前
8、Python正则表达式精准搜索实战:从模糊匹配到精准定位
开发语言·python·正则表达式·django·flask·pygame·tornado