安装matplotlib
pip install matplotlib
matplotlib基本图形绘制
import matplotlib.pyplot as plt
运行时配置参数
#让图片可以显示中文
plt.rcParams['font.sans-serif']='Heiti'
#让图片可以显示负号
plt.rcParams['axes.unicode_minus'] = False
线形图(折线图)
x = np.linspace(-5,5,50)
y = x**2
plt.plot(x,y)
- 样式和颜色
画布的配置
#figsize :画布大小,图片宽度和高度,
#dpi:像素
plt.figure(figsize=(5,3),dpi=100)
在一个画布上绘制多个图
#figsize :画布大小,图片宽度和高度,
#dpi:像素
plt.figure(figsize=(5,3),dpi=100)
x = np.linspace(-5,5,50)
plt.plot(x,np.sin(x))
plt.plot(x,np.cos(x),'r--')
plt.plot(x,-np.cos(x))
matplotlib多图布局
- 均匀分布
- subplot()函数
fig = plt.figure(figsize=(5,3))
x = np.linspace(-5,5,50)
a1 = plt.subplot(2,2,1)
a1.plot(x,y)
a1.set_title ("图形1")
a2 = plt.subplot(2,2,2)
a2.plot(x,y)
a2.set_title ("图形2")
a2 = plt.subplot(2,2,3)
a2.plot(x,y)
a2.set_title ("图形3")
a2 = plt.subplot(2,2,4)
a2.plot(x,y)
a2.set_title ("图形4")
#自动调整布局
fig.tight_layout()
fig = plt.figure(figsize=(5,3))
x = np.linspace(-5,5,50)
a1 = plt.subplot(2,2,1)
a1.plot(x,y)
a1.set_title ("图形1")
a2 = plt.subplot(2,2,2)
a2.plot(x,y)
a2.set_title ("图形2")
a2 = plt.subplot(2,1,2)
a2.plot(x,y)
a2.set_title ("图形3")
#自动调整布局
fig.tight_layout()
图形嵌套
fig = plt.figure(figsize=(5,3))
x = np.linspace(-5,5,50)
y - x**2
a1 = fig.add_subplot(1,1,1)
a1.plot(x,y)
a2=fig.add_axes([0.2, 0.2, 0.75, 0.75])
a2.plot(x,y)
fig = plt.figure(figsize=(5,3))
x = np.linspace(-5,5,50)
a1 = plt.subplot(2,2,1)
a1.plot(x,y)
a1.set_title ("图形1")
a2 = plt.subplot(2,2,2)
a2.plot(x,y)
a2.set_title ("图形2")
a2 = plt.subplot(2,1,2)
a2.plot(x,y)
a2.set_title ("图形3")
#自动调整布局
fig.tight_layout()
双轴显示
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(0, 10, 100)
y1 = np.sin(x)
y2 = 1000 * np.cos(x)
# 第一条线
plt.plot(x, y1, 'b', label='sin')
plt.ylabel('sin', color='b')
# 创建双轴并画第二条线
plt.twinx()
plt.plot(x, y2, 'r', label='cos')
plt.ylabel('cos', color='r')
matplotlib绘图属性设置
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(0, 10, 100)
y1 = np.sin(x)
y2 = np.cos(x)
# 基本用法
plt.plot(x, y1, 'r', label='sin')
plt.plot(x, y2, 'b', label='cos')
plt.legend() # 最简单的调用
# 位置设置
plt.legend(loc='upper right') # 位置用字符串
plt.legend(loc=1) # 位置用数字(0-10)
"""
位置对照表:
'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
"""
# 格式设置
plt.legend(
loc='best',
bbox_to_anchor=(1.2, 1), # 位置微调
ncol=2, # 列数
fontsize=12, # 字体大小
title='图例标题', # 图例标题
shadow=True, # 阴影
facecolor='white', # 背景色
edgecolor='black', # 边框颜色
framealpha=0.5 # 透明度
)
# 多图例
line1, = plt.plot(x, y1, 'r', label='sin')
line2, = plt.plot(x, y2, 'b', label='cos')
plt.legend(handles=[line1, line2]) # 手动指定图例项
# 自定义图例标签
plt.legend(['Sin', 'Cos']) # 直接传入标签列表
# 分组图例
line1, = plt.plot(x, y1, 'r', label='sin')
line2, = plt.plot(x, y2, 'b', label='cos')
legend1 = plt.legend([line1], ['Sin'], loc=1)
plt.legend([line2], ['Cos'], loc=4)
plt.gca().add_artist(legend1) # 添加多个图例
# 图例外部显示
plt.legend(bbox_to_anchor=(1.05, 1), loc='upper left')
# 去除某条线的图例
plt.plot(x, y1, 'r', label='sin')
plt.plot(x, y2, 'b', label='_cos') # 标签前加下划线会在图例中隐藏
plt.show()
线条属性
坐标轴刻度
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(0, 10, 100)
y = np.sin(x)
# 1. 基本刻度设置
plt.plot(x, y)
plt.xticks([0, 2, 4, 6, 8, 10]) # 设置x轴刻度位置
plt.yticks([-1, -0.5, 0, 0.5, 1]) # 设置y轴刻度位置
# 2. 刻度标签设置
plt.xticks([0, 2, 4, 6, 8, 10],
['零', '二', '四', '六', '八', '十']) # 自定义刻度标签
# 3. 刻度旋转
plt.xticks(rotation=45) # 旋转刻度标签
# 4. 设置刻度格式
plt.gca().xaxis.set_major_formatter(plt.FormatStrFormatter('%.2f')) # 保留小数点后2位
# 5. 设置刻度间隔
plt.gca().xaxis.set_major_locator(plt.MultipleLocator(2)) # 主刻度间隔为2
plt.gca().xaxis.set_minor_locator(plt.MultipleLocator(0.5)) # 次刻度间隔为0.5
# 6. 隐藏刻度
plt.xticks([]) # 隐藏x轴刻度
plt.yticks([]) # 隐藏y轴刻度
# 7. 刻度内外设置
plt.tick_params(axis='x', direction='in') # 刻度线向内
plt.tick_params(axis='y', direction='out') # 刻度线向外
# 8. 设置刻度样式
plt.tick_params(
axis='both', # 同时设置xy轴
which='both', # 同时设置主次刻度
length=5, # 刻度线长度
width=2, # 刻度线宽度
colors='red', # 刻度颜色
labelsize=12, # 刻度标签大小
grid_color='gray', # 网格线颜色
grid_alpha=0.5 # 网格线透明度
)
# 9. 日期刻度
import matplotlib.dates as mdates
plt.gca().xaxis.set_major_formatter(mdates.DateFormatter('%Y-%m-%d')) # 日期格式化
# 10. 对数刻度
plt.yscale('log') # 设置y轴为对数刻度
# 11. 科学计数法
plt.ticklabel_format(style='sci', axis='y', scilimits=(0,0))
plt.show()
坐标轴范围
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(0, 10, 100)
y = np.sin(x)
plt.plot(x, y)
# 1. 使用xlim和ylim
plt.xlim(0, 5) # 设置x轴范围
plt.ylim(-0.5, 0.5) # 设置y轴范围
# 2. 使用axis设置所有范围
plt.axis([0, 5, -0.5, 0.5]) # [xmin, xmax, ymin, ymax]
# 3. 自动调整
plt.axis('auto') # 自动调整
plt.axis('equal') # 等比例
plt.axis('square') # 正方形
plt.axis('tight') # 紧凑显示
plt.axis('scaled') # 等比例缩放
# 4. 使用set_xlim和set_ylim
ax = plt.gca()
ax.set_xlim([0, 5])
ax.set_ylim([-0.5, 0.5])
# 5. 反转坐标轴
plt.xlim(5, 0) # x轴反转
plt.ylim(0.5, -0.5) # y轴反转
# 6. 获取当前范围
xmin, xmax = plt.xlim()
ymin, ymax = plt.ylim()
plt.show()
标题和网格线
plt.titre : 标题
plt.grind : 表格
标签
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(0, 10, 100)
y = np.sin(x)
plt.xlabel('caidanb',rotation=5)
plt.ylabel('yzhou',rotation=6)
plt.plot(x, y)
文本
画文字
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(0, 10, 10)
y = np.sin(x)
plt.xlabel('caidanb',rotation=5)
plt.ylabel('yzhou',rotation=6)
plt.plot(x, y)
for a,b in zip(x,y):
plt.text(x=a,y=b,s=b)
注释标注
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(0, 10, 100)
y = np.sin(x)
plt.plot(x, y)
# 1. 简单文本注释
plt.text(5, 0.5, '这是一个文本注释',
fontsize=12,
color='red',
alpha=0.7)
# 2. 带箭头的注释
plt.annotate('最大值',
xy=(1.5, 1), # 箭头指向的点
xytext=(2, 1.5), # 文本位置
arrowprops=dict(
facecolor='black',
shrink=0.05,
width=2
))
# 3. 不同样式的箭头
plt.annotate('样式1',
xy=(3, 0.5),
xytext=(4, 1),
arrowprops=dict(
arrowstyle='->',
))
plt.annotate('样式2',
xy=(5, 0.5),
xytext=(6, 1),
arrowprops=dict(
arrowstyle='fancy',
fc='red',
ec='none'
))
# 4. 添加数学公式
plt.text(7, 0.5, r'$\sigma=1, \mu=0$')
# 5. 添加带框的文本
plt.text(4, -0.5, '带框文本',
bbox=dict(
facecolor='white',
edgecolor='red',
alpha=0.7
))
# 6. 设置文本对齐方式
plt.text(2, 0, 'center',
horizontalalignment='center',
verticalalignment='center')
# 7. 添加带连接线的注释
plt.annotate('连接线示例',
xy=(6, -0.5),
xytext=(7, -1),
arrowprops=dict(
arrowstyle='-',
connectionstyle='arc3,rad=0.3'
))
# 8. 设置注释的坐标系
plt.annotate('相对坐标',
xy=(8, 0),
xycoords='data', # 数据坐标系
xytext=(0.8, 0.8),
textcoords='axes fraction' # 轴的相对坐标
)
# 9. 批量添加注释
points = [(1, np.sin(1)), (2, np.sin(2)), (3, np.sin(3))]
for x, y in points:
plt.annotate(f'({x:.1f}, {y:.1f})',
(x, y),
xytext=(5, 5),
textcoords='offset points')
plt.show()
保存图片
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(0, 10, 100)
y = np.sin(x)
plt.plot(x, y)
plt.plot(x, y**2)
plt.savefig('data.png')
mmatplotlib常用视图
折线图
import matplotlib.pyplot as plt
import numpy as np
# 固定随机种子,保证每次生成相同的随机数
np.random.seed(42)
# 方法1:简单折线图
x = np.arange(10)
y1 = np.random.randint(1, 10, 10) # 随机整数
y2 = [2, 4, 6, 8, 10, 8, 6, 4, 2, 4] # 固定值
plt.figure(figsize=(10, 6))
plt.plot(x, y1, 'ro-', label='随机数据') # r红色,o圆点,-线
plt.plot(x, y2, 'bs-', label='固定数据') # b蓝色,s方点,-线
plt.grid(True) # 添加网格
plt.legend() # 显示图例
plt.title('简单折线图示例')
plt.xlabel('X轴')
plt.ylabel('Y轴')
# 方法2:更复杂的随机数据
x = np.linspace(0, 10, 50)
y1 = np.sin(x) + np.random.normal(0, 0.1, 50) # 带噪声的正弦
y2 = np.cos(x) # 固定的余弦
plt.figure(figsize=(10, 6))
plt.plot(x, y1, 'g-', label='带噪声的正弦', alpha=0.7)
plt.plot(x, y2, 'b-', label='标准余弦', alpha=0.7)
plt.grid(True, linestyle='--', alpha=0.5)
plt.legend()
plt.title('带噪声的正弦和标准余弦对比')
# 方法3:多组随机数据对比
categories = ['A', 'B', 'C', 'D', 'E']
values1 = np.random.randint(60, 100, 5) # 第一组随机数
values2 = np.random.randint(70, 90, 5) # 第二组随机数
values3 = [80, 85, 82, 87, 85] # 固定值
plt.figure(figsize=(10, 6))
plt.plot(categories, values1, 'ro-', label='随机组1')
plt.plot(categories, values2, 'bo-', label='随机组2')
plt.plot(categories, values3, 'go-', label='固定组')
plt.grid(True)
plt.legend()
plt.title('多组数据对比')
plt.ylim(50, 100) # 设置y轴范围
plt.show()
柱状图和条形图
柱形图
import matplotlib.pyplot as plt
# 定义类别和数值
categories = ['A', 'B', 'C', 'D']
values = [10, 20, 15, 30]
# 绘制柱状图
plt.bar(categories, values)
# 添加标题和标签
plt.title('Bar Chart Example')
plt.xlabel('Categories')
plt.ylabel('Values')
# 显示图表
plt.show()
条形图
import matplotlib.pyplot as plt
# 定义类别和数值
categories = ['A', 'B', 'C', 'D']
values = [10, 20, 15, 30]
# 绘制条形图
plt.barh(categories, values)
# 添加标题和标签
plt.title('Horizontal Bar Chart Example')
plt.xlabel('Values')
plt.ylabel('Categories')
# 显示图表
plt.show()
直方图
import matplotlib.pyplot as plt
# 定义类别和数值
# 绘制条形图
plt.hist(range(10))
# 添加标题和标签
plt.title('Horizontal Bar Chart Example')
plt.xlabel('Values')
plt.ylabel('Categories')
# 显示图表
plt.show()
箱型图
import matplotlib.pyplot as plt
# 数据
scores = [85, 78, 92, 88, 75, 83, 90, 77, 82, 86]
# 绘制箱型图
plt.boxplot(scores)
plt.title('学生考试成绩的箱型图')
plt.ylabel('成绩')
plt.show()
散点图
import matplotlib.pyplot as plt
# 数据
x = [1, 2, 3, 4, 5] # 第一个变量的值
y = [2, 3, 5, 7, 11] # 第二个变量的值
# 绘制散点图
plt.scatter(x, y)
# 添加标题和标签
plt.title('散点图示例')
plt.xlabel('变量X')
plt.ylabel('变量Y')
# 显示图表
plt.show()
饼图
import matplotlib.pyplot as plt
# 数据
labels = 'A', 'B', 'C', 'D'
sizes = [15, 30, 45, 10]
colors = ['gold', 'yellowgreen', 'lightcoral', 'lightskyblue']
explode = (0.1, 0, 0, 0) # 只有A部分突出显示
# 绘制饼图
plt.pie(sizes, explode=explode, labels=labels, colors=colors,
autopct='%1.1f%%', shadow=True, startangle=140)
# 添加标题
plt.title('饼图示例')
# 确保饼图是圆形的
plt.axis('equal')
# 显示图表
plt.show()
面积图
import matplotlib.pyplot as plt
# 数据
x = [0, 1, 2, 3, 4, 5]
y1 = [0, 1, 4, 9, 16, 25]
y2 = [0, 1, 3, 6, 10, 15]
# 绘制面积图
plt.fill_between(x, y1, color="skyblue", alpha=0.4, label='y = x^2')
plt.fill_between(x, y2, color="lightgreen", alpha=0.4, label='y = x * (x + 1) / 2')
# 添加图例
plt.legend()
# 添加标题和标签
plt.title('面积图示例')
plt.xlabel('X轴')
plt.ylabel('Y轴')
# 显示图表
plt.show()
热力图
import numpy as np
import matplotlib.pyplot as plt
# 创建示例数据
data = np.random.rand(10, 10) # 生成一个10x10的随机数据矩阵
# 绘制热力图
plt.imshow(data, cmap='viridis') # 使用viridis颜色映射
plt.colorbar() # 显示颜色条
plt.title('基础热力图')
plt.show()
等高线图
import matplotlib.pyplot as plt
import numpy as np
# 创建网格数据
x = np.linspace(-3, 3, 100)
y = np.linspace(-3, 3, 100)
X, Y = np.meshgrid(x, y)
# 创建函数值数据,例如:Z = (X^2 + Y^2)
Z = np.sqrt(X**2 + Y**2)
# 创建等高线图
plt.figure(figsize=(8, 6))
cp = plt.contourf(X, Y, Z, 6, cmap='viridis') # 6表示等高线的数量
plt.colorbar(cp) # 显示颜色条
# 添加标题和标签
plt.title('等高线图示例')
plt.xlabel('X轴')
plt.ylabel('Y轴')
# 显示图表
plt.show()
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END
暂无评论内容