Matplotlib数据可视化库




1、Matplotlib概述


Matplotlib是Python中最流行的数据可视化库之一,提供了丰富的绘图功能。使用Matplotlib可以用来绘制各种静态、动态、交互式的图表,包括折线图、散点图、柱状图、饼图等。Matplotlib通常与NumPy和SciPy一起使用

1.1、Matplotlib基本绘图功能


以下是Matplotlib的一些基本绘图功能:

  • 折线图:使用plt.plot()函数可以创建折线图。你可以指定x轴和y轴的数据,以及其他参数来自定义图表的样式
  • 柱状图:使用plt.bar()函数可以创建柱状图。你可以指定x轴和y轴的数据,以及其他参数来自定义柱状图的样式
  • 饼图:使用plt.pie()函数可以创建饼图。你可以指定饼图的数据和标签,以及其他参数来自定义饼图的样式
  • 散点图:使用plt.scatter()函数可以创建散点图。你可以指定x轴和y轴的数据,以及其他参数来控制散点的大小、颜色等属性

1.2、Matplotlib图形美化与注释


Matplotlib提供了丰富的图形美化和注释功能,以提升图表的可读性和美观性

以下是Matplotlib的一些图形美化和注解功能:

  • 坐标轴设置:使用plt.xlabel()、plt.ylabel()、plt.xlim()、plt.ylim()等函数可以设置坐标轴的标签和范围。
  • 图表标题:使用plt.title()函数可以设置图表的标题。
  • 图例设置:使用plt.legend()函数可以添加图例,并通过参数控制图例的位置、大小和样式。
  • 线条样式:通过plt.plot()函数的linestyle参数可以设置线条的样式,如实线、虚线、点线等。
  • 标注和注释:使用plt.annotate()和plt.text()函数可以在图表中添加文本标注和注释。
  • 图形保存:使用plt.savefig()函数可以将图表保存为图像文件,如PNG、JPEG等格式

接下来以一些常用绘图为示例进行详细演示,首先导入需要使用到的库:

import matplotlib.pyplot as plt
import numpy as np

Pyplot是Matplotlib的子库,提供了和MATLAB类似的绘图API

Pyplot是最常用的绘图模块,可以方便绘制2D图表

2、Matplotlib折线图


plot()方法:用于绘制折线图

'''
# 画单条线
plot(x, y, fmt, **kwargs)
# 画多条线
plot(x, y, fmt, x2, y2, fmt2, ..., **kwargs)
 - x, y:点或线的节点,x为x轴数据,y为y轴数据,数据可以是列表或数组
 - fmt:可选,定义基本格式(如颜色、标记和线条样式)
 - **kwargs:可选,用于二维平面图上,设置属性,如标签,线的宽度等
'''

绘制正弦余弦图:

x = np.arange(0, 4*np.pi, 0.1)       # arange(start,stop,step)
y = np.sin(x)
z = np.cos(x)
plt.plot(x, y, x, z)
plt.show()

2.1、Matplotlib绘图标记


1) marker参数:使用plot()方法的marker参数来标记字符

x_points = np.array(range(6))
y_points = np.array([3, 8, 1, 10, 5, 7])
plt.plot(x_points, y_points, marker='o')
plt.show()

2)fmt参数:fmt参数定义了基本格式,如标记、线条样式和颜色

fmt = '[marker][line][color]'
x_points = np.array(range(6))
y_points = np.array([3, 8, 1, 10, 5, 7])
plt.plot(x_points, y_points, 'o:r')
plt.show()
'''
颜色字符:b蓝色,m品红,g绿色,y黄色,r红色,k黑色,w白色,c青绿,'#008000'RGB颜色符串(多条曲线不指定颜色时,会自动选择不同颜色)
线型参数:‐实线(solid),‐‐破折线(dashed),‐.点划线(dashdot),:虚线(dotted)
标记字符:.点标记,,像素标记(极小点),o实心圈标记,*五角星,v倒三角标记,^上三角标记,>右三角标记,<左三角标记等
'''

3)标记大小与颜色

'''
ms:定义标记的大小
mfc:定义标记内部的颜色
mec:定义标记边框的颜色
'''
y_points = np.array([6, 2, 13, 10])
plt.plot(y_points, marker='o', ms=15, mec='r', mfc='#4CAF50')
plt.show()

annotate()方法:箭头注释

'''
plt.annotate('$文本内容$',xy=(标记点x,标记点y),xytext=(文本位置x,文本位置y)
'''

2.2、Matplotlib绘图线


1)自定义线的样式,包括线的类型、颜色和大小等

'''
- ls参数(linestyle):线的类型
- c参数(color):线的颜色
- lw参数(linewidth):线的宽度
'''
y_points = np.array([6, 2, 13, 10])
plt.plot(y_points, ls='-.', c='SeaGreen', lw='2.0')
plt.show()

2)绘制多线条(图例)

'''
legend('图例名',loc,fontsize,shadow,labelspacing,handlelength)
 - '图例名':若在plot()中添加label='图例名',此处可省略
 - loc:图例位置:1或upper right、2或upper left、3或lower left、4或lower right
 - fontsize:字体大小,int或float类型
 - shadow: 图例边框是否添加阴影
 - labelspacing: 图例中条目间的距离
 - handlelength: 图例句柄的长度
'''
y1 = np.array([3, 7, 5, 9])
y2 = np.array([6, 2, 13, 10])
plt.plot(y1, label='y1')
plt.plot(y2, label='y2')
plt.legend(loc=1, labelspacing=1, handlelength=2, fontsize=14, shadow=True)
plt.show()

2.3、Matplotlib轴标签和标题


1)xlabel()、ylabel()方法:用于设置x轴、y轴标签

2)title()方法:用于设置标题

图形中文显示:Matplotlib默认不支持中文,解决如下:

# 方式1:
plt.rcParams["font.family"] = "SimHei"

x = np.arange(1, 11)
y = 2 * x + 5
plt.title("标题", fontproperties="SimHei")
# 方式2:fontproperties:设置中文字体;fontsize:设置字体大小
plt.xlabel("x轴", fontproperties="SimHei", fontsize=12)
plt.ylabel("y轴", fontproperties="SimHei", fontsize=12)
plt.plot(x, y)
plt.show()

3)loc参数:标题与标签的定位

'''
title(loc):设置标题显示的位置: 'left', 'right', 和 'center'(默认)
xlabel(loc):设置x轴显示的位置: 'left', 'right', 和 'center'(默认)
ylabel(loc):设置y轴显示的位置: 'bottom', 'top', 和 'center'(默认)
'''

2.4、Matplotlib网格线与边框


grid()方法:用于设置图表的网格线

'''
grid(b=None, axis='both')
b:布尔类型,是否显示网格线
axis:哪个方向的网格线,both(默认)、x轴或y轴
**kwargs:设置网格样式,如颜色color='r', 样式linestyle='-'和宽度linewidth=2
'''

边框相关:

'''
ax = plt.gca():获取坐标轴信息
ax.spines():选择边框:top、right、bottom、left
ax.set_color():设置边框颜色,none表示不显示
'''

2.5、Matplotlib画板(绘制多图)


figure()方法:用于创建一个画板:

'''
fig = plt.figure(figsize, dpi)
 - figsize:画板大小(宽高),单位英寸
 - dpi:绘图对象的分辨率
 - facecolor:背景颜色
 - dgecolor:边框颜色
 - frameon:是否显示边框
'''

给画板添加标题:

'''
fig.suptitle("画板标题")
'''

1)绘制双轴图

# 创建图形对象
fig = plt.figure(figsize=(10, 8), frameon=False)
# 添加子图区域:add_axes()的参数是一个序列,序列中4个数字分别对应图形的左侧,底部,宽度和高度
ax1 = fig.add_axes([0, 0, 1, 1])
# 数据
x = np.arange(1, 11)
# 绘制指数函数:y=exp(x)
ax1.plot(x, np.exp(x))
# 设置y轴标签名称
ax1.set_ylabel('exp')
# 添加双轴
ax2 = ax1.twinx()
# 绘制对数函数(红色实线圆点):y=log(x)
ax2.plot(x, np.log(x), 'ro-')
# 设置y轴标签名称
ax2.set_ylabel('log')
# 添加图例
fig.legend(labels=('exp', 'log'), loc='upper left')
# 添加标题
plt.title('Double Axis')
plt.show()

2)subplot()方法

'''
subplot(nrows, ncols, index, **kwargs)
- 将整个绘图区域分成nrows行和ncols列,从左到右、从上到下对每个子区域进行编号1-N,左上1、右下N,编号可通过index设置
'''
# 将图表绘制成1x2的图片区域
plt.rcParams["font.family"] = "SimHei"
# plot 1:
x_points = np.array([0, 6])
y_points = np.array([0, 100])
plt.subplot(1, 2, 1)
plt.plot(x_points, y_points)
plt.title("plot 1")
# plot 2:
x = np.array([1, 2, 3, 4])
y = np.array([1, 4, 9, 16])
plt.subplot(1, 2, 2)
plt.plot(x, y)
plt.title("plot 2")

plt.suptitle("nrows*ncols为1x2的图片区域")
plt.show()

3)subplots()方法

'''
subplots(nrows, ncols, sharex=False, sharey=False)
- sharex、sharey:设置x、y轴是否共享属性,可设置为none、all、row或col
'''
plt.rcParams["font.family"] = "SimHei"
x = np.linspace(0, 2*np.pi, 400)
y = np.sin(x**2)
# 创建一个画板和两个子图,共享y轴
fig, (ax1, ax2) = plt.subplots(1, 2, sharey='row')
# 在子图1上绘画
ax1.plot(x, y)
# 为子图1添加标题
ax1.set_title('ax1_title')
# 添加图例
ax1.legend('图1', loc=1, labelspacing=1, handlelength=2, fontsize=14, shadow=True)
# 在指定位置添加文本
ax1.text(1, 1, "text")
# 是否显示网格
ax1.grid(True)
# 在子图2上绘制散点图
ax2.scatter(x, y)
# 为子图2添加标题
ax2.set_title('ax2_title')
# 添加图例
ax2.legend('图2', loc=1, labelspacing=1, handlelength=2, fontsize=14, shadow=True)
# 添加画板标题
fig.suptitle("Sharing y axis")
plt.show()

3、Matplotlib柱状图


bar()方法:用于绘制柱状图

'''
bar(x, y, height, width=0.8, align='center')
 - x:柱形图x轴数据,浮点型数组
 - height:柱形图的高度,浮点型数组
 - width:柱形图的宽度,浮点型数组
 - align:柱形图与x坐标的对齐方式
'''
x = np.array(["Bar-1", "Bar-2", "Bar-3", "Bar-4"])
y = np.array([12, 22, 6, 18])
plt.bar(x, y, width=0.4, color="#4CAF50")
plt.show()

barh():垂直方向的柱状图

x = np.array(["Bar-1", "Bar-2", "Bar-3", "Bar-4"])
y = np.array([12, 22, 6, 18])
plt.barh(x, y, height=0.4)
plt.show()

4、Matplotlib饼图


pie()方法:用于绘制饼图

'''
pie(x,labels,autopct,explode,colors)
 - x:绘制饼图的数据,浮点型数组或列表
 - explode:各个扇形间的间隔,默认0,数组
 - labels:各个扇形的标签,列表
 - colors:各个扇形的颜色,数组
 - autopct:设置各个扇形百分比显示格式:%d%%整数、%0.1f%%一位小数、%0.2f%%两位小数
 - radius::设置饼图的半径,默认1
 - shadow::设置饼图的阴影,布尔类型,默认False
 - startangle:设置饼图的起始角度,默认为从x轴正方向逆时针画起,如设定90则从y轴正方向画起
'''
# 数据
data = [15, 30, 45, 10]
# 饼图的标签
labels = ['A', 'B', 'C', 'D']
# 饼图的颜色
colors = ['yellowgreen', 'gold', 'lightskyblue', 'lightcoral']
# 突出显示第二个扇形
explode = (0, 0.1, 0, 0)
# 绘制饼图
plt.pie(data, explode=explode, labels=labels, colors=colors, autopct='%1.1f%%', shadow=True, startangle=90)
# 标题
plt.title("Pie Title")
# 显示图形
plt.show()

5、Matplotlib散点图


scatter()方法:用于绘制散点图

'''
scatter(x, y, s, c, marker, cmap, alpha)
 - x,y:绘制散点图的数据点,长度相同的数组
 - s:点的大小,默认20,可以为数组
 - c:点的颜色,默认蓝色,也可为RGB或RGBA二维行数组
 - marker:点的样式,默认小圆圈o
 - cmap:设置颜色条
 - alpha:设置透明度,0-1之间,默认不透明
'''

1)绘制两组散点图

x = np.array([5, 7, 8, 7, 2, 17, 2, 9, 4, 11, 12, 9, 6])
y = np.array([99, 86, 87, 88, 111, 86, 103, 87, 94, 78, 77, 85, 86])
plt.scatter(x, y, color='hotpink')

x = np.array([2, 2, 8, 1, 15, 8, 12, 9, 7, 3, 11, 4, 7, 14, 12])
y = np.array([100, 105, 84, 105, 90, 99, 90, 95, 94, 100, 79, 112, 91, 80, 85])
plt.scatter(x, y, color='#88c999')

plt.title("Scatter Title")
plt.show()

2)使用随机数绘制散点图

# 随机数生成器的种子
np.random.seed(19680801)

N = 50
x = np.random.rand(N)
y = np.random.rand(N)
colors = np.random.rand(N)
# 0-15 point
area = (30 * np.random.rand(N))**2
# 设置颜色及透明度
plt.scatter(x, y, s=area, c=colors, alpha=0.5)

plt.title("Scatter Title")
plt.show()

# savefig()方法:指定dpi(分辨率)保存绘图
plt.savefig('img.jpg',dpi=600)

6、Matplotlib绘制任意函数


以下是一个基本示例:

import matplotlib.pylab as plt
import numpy as np

# 定义二次函数
def f(x):
    return pow((x-5), 2) + 2

# 曲线:f(x)=x^2 -10x + 27
# 求导(切线斜率):f(x)' = 2x - 10
# (1.5,14.25)  在x=1.5处的斜率:-7  y=-7x+b  b=24.75  y=-7x+24.75
# (2.5,8.25)   在x=2.5处的斜率:-5  y=-5x+b  b=20.75  y=-5x+20.75
# (3.5,4.25)

# 定义一次函数(切线)
def y1(x):
    return -7*x+24.75

def y2(x):
    return -5*x+20.75

# 设置画布大小
plt.figure(figure=(10, 5))

# 设置x轴的范围
x = np.linspace(0, 10, 100)

# 绘制二次曲线
plt.plot(x, f(x), color='red', linewidth=1)

# 绘制切线1
plt.plot(x, y1(x), color='green', ls='--', linewidth=1)
# 切点1
plt.scatter(1.5, 14.25, color="green")
# 标记虚线
plt.plot([0, 1.5], [14.25, 14.25], c='green', linestyle='--', linewidth=1)
plt.plot([1.5, 1.5], [0, 14.25], c='green', linestyle='--', linewidth=1)
# 对应x,y坐标标签
plt.text(1.4, -1.4, r'$\omega_1$')
plt.text(-1, 14, r'$L(\omega_1)$')
# 标注点A
plt.text(1.8, 14.4, 'A')

# 绘制切线2
plt.plot(x, y2(x), ls='--', linewidth=1)
# 切点2
plt.scatter(2.5, 8.25)
# 标记虚线
plt.plot([0, 2.5], [8.25, 8.25], c='#1f77b4', linestyle='--', linewidth=1)
plt.plot([2.5, 2.5], [0, 8.25], c='#1f77b4', linestyle='--', linewidth=1)
# 对应x,y坐标标签(Matplotlib支持LaTeX表达式)
plt.text(2.4, -1.4, r'$\omega_2$')
plt.text(-1, 8, r'$L(\omega_2)$')
# 标注点B
plt.text(2.8, 8.4, 'B')

# 再标注一个点C
plt.scatter(3.5, 4.25, color='blue')
plt.text(3.8, 4.4, 'C')

# x、y轴坐标限制(解决两个坐标轴0点不重合问题)
plt.xlim([0, 10])
plt.ylim([0, 25])

# 添加坐标轴标签
plt.xlabel(r'$\omega$', loc='right')
# rotation=0:设置y轴标签水平显示(默认90)
plt.ylabel(r'$L$', loc='top', rotation=0)
plt.show()

结果如下:

在这里插入图片描述



  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值