AI 摘要: 本文介绍了使用Matplotlib绘制各种图表的案例,包括折线图、散点图、柱状图等,详细说明了数据准备、图形创建、绘制、设置坐标轴、添加网格、标签和标题、保存图像及显示图像的步骤。总结了不同图表类型的主要用途及相应的Matplotlib API函数。
测试一
# plt.figure(figsize=(),dpi=)
# figsize:指定图的长宽
# dpi:图像的清晰度
plt.figure(figsize=(10,10) ,dpi=100)
plt.plot([1,2,3,4,5,6,7],[12,18,16,19,12,15,10])
plt.showce
案例一
需求:画出某城市11点到12点1小时内每分钟的温度变化折线图,温度范围在15度~18度
如图:
案例完整代码
import matplotlib.pyplot as plt
import random
from pylab import mpl
# 设置显示中文字体
mpl.rcParams["font.sans-serif"] = ["SimHei"]
# 设置正常显示符号
mpl.rcParams["axes.unicode_minus"] = False
# 0.准备数据
x = range(60)
y_shanghai = [random.uniform(15, 18) for i in x]
# 1.创建画布
plt.figure(figsize=(20, 8), dpi=100)
# 2.绘制图像
plt.plot(x, y_shanghai)
# 2.1 添加x,y轴刻度
# 构造x,y轴刻度标签
x_ticks_label = ["11点{}分".format(i) for i in x]
y_ticks = range(40)
# 刻度显示
plt.xticks(x[::5], x_ticks_label[::5])
plt.yticks(y_ticks[::5])
# 2.2 添加网格显示
plt.grid(True, linestyle="--", alpha=0.5)
# 2.3 添加描述信息
plt.xlabel("时间")
plt.ylabel("温度")
plt.title("中午11点--12点某城市温度变化图", fontsize=20)
# 2.4 图像保存
plt.savefig("./test.png")
# 3.图像显示
plt.show()
案例一文档:
这段代码展示了如何使用Python的Matplotlib库创建一个简单的温度变化图表。下面是代码的详细解释:
导入必要的库
import matplotlib.pyplot as plt
import random
from pylab import mpl
这里导入了matplotlib的pyplot模块、random模块和pylab的mpl模块。
设置中文显示
mpl.rcParams["font.sans-serif"] = ["SimHei"]
mpl.rcParams["axes.unicode_minus"] = False
这两行代码设置了matplotlib的参数,使其能够正确显示中文字体和负号。
准备数据
x = range(60)
y_shanghai = [random.uniform(15, 18) for i in x]
创建了x轴数据(0到59的整数)和y轴数据(15到18之间的随机浮点数)。
创建画布
plt.figure(figsize=(20, 8), dpi=100)
创建一个20x8英寸、分辨率为100dpi的图形。
绘制图像
plt.plot(x, y_shanghai)
使用x和y_shanghai数据绘制折线图。
设置坐标轴
x_ticks_label = ["11点{}分".format(i) for i in x]
y_ticks = range(40)
plt.xticks(x[::5], x_ticks_label[::5])
plt.yticks(y_ticks[::5])
设置x轴和y轴的刻度标签。x轴每5分钟显示一次,y轴每5度显示一次。
添加网格
plt.grid(True, linestyle="--", alpha=0.5)
添加网格线,使用虚线样式,透明度为0.5。
添加标签和标题
plt.xlabel("时间")
plt.ylabel("温度")
plt.title("中午11点--12点某城市温度变化图", fontsize=20)
为x轴、y轴添加标签,并设置图表标题。
保存图像
plt.savefig("./test.png")
将图表保存为PNG文件。
显示图像
plt.show()
在屏幕上显示生成的图表。
这段代码生成了一个展示某城市在11点到12点之间温度变化的折线图,并将其保存为图片文件。
案例二
需求: 在一个坐标系中绘制多个图像,再添加一个城市的温度变化
# 增加北京的温度数据
y_beijing = [random.uniform(1, 3) for i in x]
# 绘制折线图
plt.plot(x, y_shanghai)
# 使用多次plot可以画多个折线
plt.plot(x, y_beijing, color='r', linestyle='--')
图形风格的说明
颜色字符 | 风格字符 |
---|---|
r 红色 | - 实线 |
g 绿色 | - - 虚线 |
b 蓝色 | -. 点划线 |
w 白色 | : 点虚线 |
c 青色 | ’ ’ 留空、空格 |
m 洋红 | |
y 黄色 | |
k 黑色 |
图例的显示
# 绘制折线图
plt.plot(x, y_shanghai, label="上海")
# 使用多次plot可以画多个折线
plt.plot(x, y_beijing, color='r', linestyle='--', label="北京")
# 显示图例
plt.legend(loc="best")
Location String | Location Code |
---|---|
‘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 |
案例的完整代码
# 0.准备数据
x = range(60)
y_shanghai = [random.uniform(15, 18) for i in x]
y_beijing = [random.uniform(1,3) for i in x]
# 1.创建画布
plt.figure(figsize=(20, 8), dpi=100)
# 2.绘制图像
plt.plot(x, y_shanghai, label="上海")
plt.plot(x, y_beijing, color="r", linestyle="--", label="北京")
# 2.1 添加x,y轴刻度
# 构造x,y轴刻度标签
x_ticks_label = ["11点{}分".format(i) for i in x]
y_ticks = range(40)
# 刻度显示
plt.xticks(x[::5], x_ticks_label[::5])
plt.yticks(y_ticks[::5])
# 2.2 添加网格显示
plt.grid(True, linestyle="--", alpha=0.5)
# 2.3 添加描述信息
plt.xlabel("时间")
plt.ylabel("温度")
plt.title("中午11点--12点某城市温度变化图", fontsize=20)
# 2.4 图像保存
plt.savefig("./test.png")
# 2.5 添加图例
plt.legend(loc=0)
# 3.图像显示
plt.show()
案例二的文档:
准备数据
x = range(60)
y_shanghai = [random.uniform(15, 18) for i in x]
y_beijing = [random.uniform(1,3) for i in x]
创建了x轴数据(0到59的整数)和两组y轴数据:
- 上海:15到18之间的随机温度
- 北京:1到3之间的随机温度
创建画布
plt.figure(figsize=(20, 8), dpi=100)
创建一个20x8英寸、分辨率为100dpi的图形。
绘制图像
plt.plot(x, y_shanghai, label="上海")
plt.plot(x, y_beijing, color="r", linestyle="--", label="北京")
绘制两条折线:
- 上海数据用默认颜色和实线
- 北京数据用红色和虚线
设置坐标轴
x_ticks_label = ["11点{}分".format(i) for i in x]
y_ticks = range(40)
plt.xticks(x[::5], x_ticks_label[::5])
plt.yticks(y_ticks[::5])
设置x轴和y轴的刻度标签。x轴每5分钟显示一次,y轴每5度显示一次。
添加网格
plt.grid(True, linestyle="--", alpha=0.5)
添加网格线,使用虚线样式,透明度为0.5。
添加标签和标题
plt.xlabel("时间")
plt.ylabel("温度")
plt.title("中午11点--12点某城市温度变化图", fontsize=20)
为x轴、y轴添加标签,并设置图表标题。
保存图像
plt.savefig("./test.png")
将图表保存为PNG文件。
添加图例
plt.legend(loc=0)
添加图例,loc=0
表示自动选择最佳位置。
显示图像
plt.show()
在屏幕上显示生成的图表。
案例三
需求:多个坐标系显示— plt.subplots(面向对象的画图方法)
案例完整代码:
# 0.准备数据
x = range(60)
y_shanghai = [random.uniform(15, 18) for i in x]
y_beijing = [random.uniform(1, 5) for i in x]
# 1.创建画布
# plt.figure(figsize=(20, 8), dpi=100)
fig, axes = plt.subplots(nrows=1, ncols=2, figsize=(20, 8), dpi=100)
# 2.绘制图像
# plt.plot(x, y_shanghai, label="上海")
# plt.plot(x, y_beijing, color="r", linestyle="--", label="北京")
axes[0].plot(x, y_shanghai, label="上海")
axes[1].plot(x, y_beijing, color="r", linestyle="--", label="北京")
# 2.1 添加x,y轴刻度
# 构造x,y轴刻度标签
x_ticks_label = ["11点{}分".format(i) for i in x]
y_ticks = range(40)
# 刻度显示
# plt.xticks(x[::5], x_ticks_label[::5])
# plt.yticks(y_ticks[::5])
axes[0].set_xticks(x[::5])
axes[0].set_yticks(y_ticks[::5])
axes[0].set_xticklabels(x_ticks_label[::5])
axes[1].set_xticks(x[::5])
axes[1].set_yticks(y_ticks[::5])
axes[1].set_xticklabels(x_ticks_label[::5])
# 2.2 添加网格显示
# plt.grid(True, linestyle="--", alpha=0.5)
axes[0].grid(True, linestyle="--", alpha=0.5)
axes[1].grid(True, linestyle="--", alpha=0.5)
# 2.3 添加描述信息
# plt.xlabel("时间")
# plt.ylabel("温度")
# plt.title("中午11点--12点某城市温度变化图", fontsize=20)
axes[0].set_xlabel("时间")
axes[0].set_ylabel("温度")
axes[0].set_title("中午11点--12点某城市温度变化图", fontsize=20)
axes[1].set_xlabel("时间")
axes[1].set_ylabel("温度")
axes[1].set_title("中午11点--12点某城市温度变化图", fontsize=20)
# # 2.4 图像保存
plt.savefig("./test.png")
# # 2.5 添加图例
# plt.legend(loc=0)
axes[0].legend(loc=0)
axes[1].legend(loc=0)
# 3.图像显示
plt.show()
案例三文档:
准备数据
x = range(60)
y_shanghai = [random.uniform(15, 18) for i in x]
y_beijing = [random.uniform(1, 5) for i in x]
创建x轴数据(0到59的整数)和两组y轴数据:
- 上海:15到18之间的随机温度
- 北京:1到5之间的随机温度
创建画布和子图
fig, axes = plt.subplots(nrows=1, ncols=2, figsize=(20, 8), dpi=100)
创建一个包含1行2列子图的画布,大小为20x8英寸,分辨率为100dpi。
绘制图像
axes[0].plot(x, y_shanghai, label="上海")
axes[1].plot(x, y_beijing, color="r", linestyle="--", label="北京")
在左侧子图绘制上海数据,在右侧子图绘制北京数据。
设置坐标轴
x_ticks_label = ["11点{}分".format(i) for i in x]
y_ticks = range(40)
for ax in axes:
ax.set_xticks(x[::5])
ax.set_yticks(y_ticks[::5])
ax.set_xticklabels(x_ticks_label[::5])
为两个子图设置相同的x轴和y轴刻度。
添加网格
for ax in axes:
ax.grid(True, linestyle="--", alpha=0.5)
为两个子图添加网格线。
添加标签和标题
for ax in axes:
ax.set_xlabel("时间")
ax.set_ylabel("温度")
ax.set_title("中午11点--12点某城市温度变化图", fontsize=20)
为两个子图添加x轴标签、y轴标签和标题。
保存图像
plt.savefig("./test.png")
将整个图表保存为PNG文件。
添加图例
for ax in axes:
ax.legend(loc=0)
为两个子图添加图例,自动选择最佳位置。
显示图像
plt.show()
在屏幕上显示生成的图表。
这段代码生成了一个包含两个子图的图表,左侧显示上海的温度变化,右侧显示北京的温度变化。这种布局允许直观地比较两个城市的温度趋势,而不会在同一个图中造成视觉混乱。每个子图都有自己的坐标轴、标题和图例,使得信息呈现更加清晰和有组织。
案例四
需求:折线图的应用场景
- 呈现公司产品(不同区域)每天活跃用户数
- 呈现app每天下载数量
- 呈现产品新功能上线后,用户点击次数随时间的变化
- 拓展:画各种数学函数图像
import numpy as np
# 0.准备数据
x = np.linspace(-10, 10, 1000)
y = np.sin(x)
# 1.创建画布
plt.figure(figsize=(20, 8), dpi=100)
# 2.绘制函数图像
plt.plot(x, y)
# 2.1 添加网格显示
plt.grid()
# 3.显示图像
plt.show()
常见图形种类及意义
-
折线图:以折线的上升或下降来表示统计数量的增减变化的统计图
特点:能够显示数据的变化趋势,反映事物的变化情况。(变化)
api:plt.plot(x, y)
-
**散点图:**用两组数据构成多个坐标点,考察坐标点的分布,判断两变量之间是否存在某种关联或总结坐标点的分布模式。
特点:判断变量之间是否存在数量关联趋势,展示离群点(分布规律)
api:plt.scatter(x, y)
-
**柱状图:**排列在工作表的列或行中的数据可以绘制到柱状图中。
特点:绘制连离散的数据,能够一眼看出各个数据的大小,比较数据之间的差别。(统计/对比)
api:plt.bar(x, width, align=‘center’, **kwargs)
Parameters: x : 需要传递的数据 width : 柱状图的宽度 align : 每个柱状图的位置对齐方式 {‘center’, ‘edge’}, optional, default: ‘center’ **kwargs : color:选择柱状图的颜色
-
**直方图:**由一系列高度不等的纵向条纹或线段表示数据分布的情况。 一般用横轴表示数据范围,纵轴表示分布情况。
特点:绘制连续性的数据展示一组或者多组数据的分布状况(统计)
api:matplotlib.pyplot.hist(x, bins=None)
Parameters: x : 需要传递的数据 bins : 组距
-
**饼图:**用于表示不同分类的占比情况,通过弧度大小来对比各种分类。
特点:分类数据的占比情况(占比)
api:plt.pie(x, labels=,autopct=,colors)
Parameters: x:数量,自动算百分比 labels:每部分名称 autopct:占比显示指定%1.2f%% colors:每部分颜色
散点图绘制
需求:探究房屋面积和房屋价格的关系
房屋面积数据:
x = [225.98, 247.07, 253.14, 457.85, 241.58, 301.01, 20.67, 288.64,
163.56, 120.06, 207.83, 342.75, 147.9 , 53.06, 224.72, 29.51,
21.61, 483.21, 245.25, 399.25, 343.35]
房屋价格数据:
y = [196.63, 203.88, 210.75, 372.74, 202.41, 247.61, 24.9 , 239.34,
140.32, 104.15, 176.84, 288.23, 128.79, 49.64, 191.74, 33.1 ,
30.74, 400.02, 205.35, 330.64, 283.45]
# 0.准备数据
x = [225.98, 247.07, 253.14, 457.85, 241.58, 301.01, 20.67, 288.64,
163.56, 120.06, 207.83, 342.75, 147.9 , 53.06, 224.72, 29.51,
21.61, 483.21, 245.25, 399.25, 343.35]
y = [196.63, 203.88, 210.75, 372.74, 202.41, 247.61, 24.9 , 239.34,
140.32, 104.15, 176.84, 288.23, 128.79, 49.64, 191.74, 33.1 ,
30.74, 400.02, 205.35, 330.64, 283.45]
# 1.创建画布
plt.figure(figsize=(20, 8), dpi=100)
# 2.绘制散点图
plt.scatter(x, y)
# 3.显示图像
plt.show()
柱状图绘制
需求-对比每部电影的票房收入
电影数据如下图所示:
- 准备数据
['雷神3:诸神黄昏','正义联盟','东方快车谋杀案','寻梦环游记','全球风暴', '降魔传','追捕','七十七天','密战','狂兽','其它']
[73853,57767,22354,15969,14839,8725,8716,8318,7916,6764,52222]
- 绘制柱状图
代码:
# 0.准备数据
# 电影名字
movie_name = ['雷神3:诸神黄昏','正义联盟','东方快车谋杀案','寻梦环游记','全球风暴','降魔传','追捕','七十七天','密战','狂兽','其它']
# 横坐标
x = range(len(movie_name))
# 票房数据
y = [73853,57767,22354,15969,14839,8725,8716,8318,7916,6764,52222]
# 1.创建画布
plt.figure(figsize=(20, 8), dpi=100)
# 2.绘制柱状图
plt.bar(x, y, width=0.5, color=['b','r','g','y','c','m','y','k','c','g','b'])
# 2.1b修改x轴的刻度显示
plt.xticks(x, movie_name)
# 2.2 添加网格显示
plt.grid(linestyle="--", alpha=0.5)
# 2.3 添加标题
plt.title("电影票房收入对比")
# 3.显示图像
plt.show()
总结
图表类型 | 主要用途 | Matplotlib API函数 |
---|---|---|
折线图 | 显示数据的变化趋势,反映事物的变化情况 | plt.plot() |
散点图 | 判断变量之间是否存在数量关联趋势,展示离群点 | plt.scatter() |
柱状图 | 绘制离散的数据,直观比较数据之间的差别 | plt.bar(x, width, align=“center”) |
直方图 | 绘制连续性数据,展示一组或多组数据的分布状况 | plt.hist(x, bins) |
饼图 | 表示不同分类的占比情况,通过弧度大小对比各种分类 | plt.pie(x, labels, autopct, colors) |