Matplotlib基本操作

本文详细介绍了Python的Matplotlib库在图形样式、画图操作方面的基本使用,包括默认样式设置、线条和坐标轴样式调整、散点图、填充图、柱状图、等高图、热成像图、饼图以及网格图和极坐标图的绘制方法。通过实例展示了如何创建和定制各种图形元素,以实现数据的可视化展示。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Matplotlib基本操作

Matplotlib是Python数据可视化工具包,其下的子包pyplot提供了面向对象的画图程序接口,几乎所有的画图函数都和MATLAB类似,连参数都类似。
插入该魔术命令%matplotlib inline 可以进行非阻塞的绘图操作,而不用显式的调用plt.show
一般性的写法import matplotlib.pyplot as plt

图形样式

默认样式

使用默认的样式绘制正弦曲线和余弦曲线

@requires_authorization
import matplotlib.pyplot as plt;
import numpy as np;
x = np.linspace(-np.pi, np.pi, 200)
c, s = np.cos(x), np.sin(x)
plt.plot(x, c)        # 画出余弦曲线
plt.plot(x, s)        # 画出正弦曲线

这里写图片描述

对样式进行设置

(1)对线条进行相关的设置

@requires_authorization
# 为余弦曲线设置线条颜色,宽度,样式
plt.plot(x, c, color='blue', linewidth=2.0, linestyle='-')
# 位正弦曲线设置线条颜色,宽度, 样式
plt.plot(x, s, color='red', linewidth=2.0, linestyle='-')

(2)对坐标轴的长度进行设置

@requires_authorization
plt.xlim(x.min()*1.1, x.max()*1.1)
plt.ylim(c.min()*1.1, c.max()*1.1)

这里写图片描述
(3)重新设置坐标轴的刻度
x轴的刻度使用自定义的标签,标签的文本使用LaTex来显示圆周率符号π

@require_authorization
plt.xticks((-np.pi, -np.pi/2, np.pi/2, np.pi),
          (r'$-\pi$', r'$-\pi/2$', r'$+\pi/2$', r'$+\pi$'))
plt.yticks([-1, -0.5, 0, 0.5, 1])

(4)将4个方向的坐标改为两个方向的交叉坐标
方法是通过设置颜色为透明色,把上方和右侧的坐标线隐藏起来,然后移动左侧和下方的坐标线到原点(0,0)的位置

@requir_authorization
ax = plt.gca()      # 获取当前的坐标轴
ax.spines['right'].set_color('none')
ax.spines['top'].set_color('none')
ax.xaxis.set_ticks_position('bottom')       # 设置刻度的显示位置
ax.spines['bottom'].set_position(('data', 0))   # 设置下方坐标的位置
ax.yaxis.set_ticks_position('left')
ax.spines['left'].set_position(('data', 0))    # 设置左侧坐标轴的位置

这里写图片描述

(5)在图片上标识出曲线的计算公式
将这个公式画到图片上,并在余弦曲线上识别出这个点,同时用虚线画出这个点所对应的的x轴的坐标

@require_authorization
t = 2 * np.pi / 3 
# 用虚线画出cos(t)的点在x轴上的位置
plt.plot([t, t], [0, np.cos(t)], color='blue', linewidth=1.5, linestyle='--')
# 画出坐标标示的坐标点,即在(t, cos(t))处画一个大小为50的蓝色点
plt.scatter([t, ], [np.cos(t), ], 50, color='blue')
# 画出标示点的值,即cos(t)的值
plt.annotate(r'$cos(\frac{2\pi}{3})=-\frac{1}{2}$',
            xy=(t, np.cos(t)), xycoords='data',
            xytext=(-90, -50), textcoords='offset points', fontsize=16,
            arrowprops=dict(arrowstyle='->', connectionstyle='arc3, rad=.2'))

这里写图片描述
(6)定制坐标轴上的刻度标签的字体
为避免正余弦曲线覆盖掉刻度标识,在刻度标签上添加一个半透明的方框作为背景

@requir_authorization
# 设置坐标刻度的字体的大小,添加半透明背景
for label in ax.get_xticklabels() + ax.get_yticklabels():
    label.set_fontsize(16)
    label.set_bbox(dict(facecolor='white', edgecolor='None', alpha=0.65))

整体效果图为如下:
这里写图片描述

图形对象

在Matplotligeb中,一个图形是指图片全部的可视区域,创建方式为plt.figure() ,在一个可视图形中可以包含多个子图,子图创建方式为plt.subplot(),子图按照网格形状排列显示在图形中。
坐标轴和子图类似,但是不同的是坐标轴不需要按网格排列,可以随意放置,创建坐标轴的方式为plt.axes()
对坐标轴进行移动需要知道当前坐标轴的位置,当前坐标轴的获取方式plt.gca()
plt.figure的常用参数为以下:
num:图形对象的标识符,可以是数字或字符串
figsize:(width, height)以英寸为单位的图形大小
dpi:图形的质量,每英寸多少点
plt.subplot()关键参数是一个元组(行, 列, 当前激活的子图序号)

@require_authorization
x = np.linspace(-np.pi, np.pi, 200, endpoint=True)
c, s = np.cos(x), np.sin(x)

plt.figure(num='sin', figsize=(16,4))     # 创建'sin'图形
plt.plot(x, s)                            #  把正弦绘制在这个图形上

plt.figure(num='cos', figsize=(16,4))     # 创建 cos图形
plt.plot(x, c)

plt.figure(num='sin')                   # 切换到 sin 的图形上
plt.plot(x, c)           # 在原型的基础上,把余弦曲线也画在这个图形上

这里写图片描述
这里写图片描述

画图操作

散点图绘制

plt.scatter()
Signature: plt.scatter(x, y, s=20, c=None, marker=’o’, cmap=None, norm=None, vmin=None, vmax=None, alpha=None, linewidths=None,
verts=None, edgecolors=None, hold=None, data=None, **kwargs)
Docstring:Make a scatter plot of x vs y, where x and y are sequence like objects of the same length.

@require_authorization
import numpy as np;
from matplotlib import pyplot as plt;

n = 1024
X = np.random.normal(0, 1, n)
Y = np.random.normal(0, 1, n)
T = np.arctan2(Y, X)       # 随机点的反正切值,使用这个值作为随机点的颜色

plt.subplot(1, 2, 1)
plt.scatter(X, Y, s=75, c=T, alpha=.5)

plt.xlim(-1.5, 1.5)
plt.xticks(())
plt.ylim(-1.5, 1.5)
plt.yticks(())

这里写图片描述

填充图的绘制

填充函数plt.fill_between()对两条曲线中间的部分进行填充,需要也别关注参数where的使用
Signature: plt.fill_between(x, y1, y2=0, where=None, interpolate=False, step=None, hold=None, data=None, **kwargs)
**Docstring:**Make filled polygons between two curves.
Create a :class:~matplotlib.collections.PolyCollection
filling the regions between *y1* and *y2* where

@require_authorization
n = 256
X = np.linspace(-np.pi, np.pi, n, endpoint=True)
Y = np.sin(2 * X)

plt.subplot(1, 2, 2)

plt.plot(X, Y+1, color='blue', alpha=1.00)
plt.fill_between(X, 1, Y+1, color='blue', alpha=.25)

plt.plot(X, Y-1, color='blue', alpha=1.00)
plt.fill_between(X, -1, Y-1, (Y-1) > -1, color='blue', alpha=.25)
plt.fill_between(X, -1, Y-1, (Y-1) < -1, color='red', alpha=.25)

plt.xlim(-np.pi, np.pi)
plt.xticks(())
plt.ylim(-2.5, 2.5)
plt.yticks(())

这里写图片描述

柱状图的绘制

ply.bar()
Signature: plt.bar(left, height, width=0.8, bottom=None, hold=None, data=None, **kwargs)
Docstring:Make a bar plot.
color : scalar or array-like, optionalthe colors of the bar faces
edgecolor : scalar or array-like, optional the colors of the bar edges

@require_authorization
n = 12
X = np.arange(n)
Y_1 = (1 - X / float(n)) * np.random.uniform(0.5, 1.0, n)
Y_2 = (1 - X / float(n)) * np.random.uniform(0.5, 1.0, n)


plt.bar(X, Y_1, facecolor='#9999ff', edgecolor='white')     
# 第一次调用plt.bar绘制出上侧的柱状图

plt.bar(X, -Y_2, facecolor='#ff9999', edgecolor='white')     
# 第二次调用plt.bar绘制出下侧的柱状图

for x, y in zip(X, Y_1):
    plt.text(x + 0.4, y + 0.05, '%.2f' % y, ha = 'center', va = 'bottom')

for x, y in zip(X, Y_2):
    plt.text(x + 0.4, - y - 0.05, '%.2f' % y, ha = 'center', va = 'top')

plt.xlim(-.5, n)
plt.xticks(())
plt.ylim(-1.25, 1.25)
plt.yticks(())

这里写图片描述

柱状等高图

plt.contourf()填充等高线 其中命名参数cmap表示其映射风格
plt.contour()画出等高线
plt.clable()画出等高线上的数字
np.meshgrid() Return coordinate matrices from coordinate vectors.

@require_authorizatin
def f(x, y):
    return (1 - x / 2 + x ** 5 + y ** 3) * np.exp(- x ** 2 - y ** 2)

n = 256
x = np.linspace(-3, 3, n)
y = np.linspace(-3, 3, n)
X, Y = np.meshgrid(x, y)

plt.contourf(X, Y, f(X, Y), 8, alpha=.75, cmap=plt.cm.hot)
C = plt.contour(X, Y, f(X, Y), 8, colors='black', linewidth=.5)
plt.clabel(C, inline=1, fontsize=10)

plt.xticks(())
plt.yticks(())

这里写图片描述

热成像图

使用plt.imshow()函数把图片当做数组画出来,命名参数cmap用来决定数组到颜色的映射网格
最后使用plt.colorbar()函数画出颜色

@require_authorization
def f(x, y):
    return (1 - x / 2 + x ** 5 + y ** 3) * np.exp(- x ** 2 - y ** 2)

n = 10
x = np.linspace(-3, 3, 4 * n )
x = np.linspace(-3, 3, 3 * n )
X, Y = np.meshgrid(x, y)
plt.imshow(f(X, Y), cmap='hot', origin='low')
plt.colorbar(shrink=.83)

plt.xticks(())
plt.yticks(())

这里写图片描述

饼图

使用plt.pie()函数绘制饼图,使用命名参数explode来实现扇形面积不同的效果
使用命名参数colors来实现扇形颜色变化的效果

@require_authorization
Z = np.ones(n)
Z[-1] *= 2

plt.pie(Z, explode=Z * 0.5, colors = ['%f' % (i/float(n)) for i in range(n)])
plt.axis('equal')
plt.xticks()
plt.yticks()

网格图

生成网格的方法
使用坐标轴的set_major_locator()set_minor_locator()方法把坐标轴设置成MultipleLocator样式,然后再使用坐标轴的grid()函数再坐标轴的刻度之间
画上线段,生成所需的网格

@require_authorization
ax = plt.subplot(1, 2, 1)

ax.set_xlim(0, 4)
ax.set_ylim(0, 3)

ax.xaxis.set_major_locator(plt.MultipleLocator(1.0))
ax.xaxis.set_minor_locator(plt.MultipleLocator(0.1))
ax.yaxis.set_major_locator(plt.MultipleLocator(1.0))
ax.yaxis.set_minor_locator(plt.MultipleLocator(0.1))

ax.grid(which='major', axis='x', linewidth=0.75, linestyle='-', color='0.75')
ax.grid(which='minor', axis='x', linewidth=0.25, linestyle='-', color='0.75')
ax.grid(which='major', axis='y', linewidth=0.75, linestyle='-', color='0.75')
ax.grid(which='minor', axis='y', linewidth=0.25, linestyle='-', color='0.75')

ax.set_xticklabels([])
ax.set_yticklabels([])

这里写图片描述

极坐标图绘制

使用plt.bar()bar.set_facecolor()来填充不同的颜色
创建子图或者坐标轴时,需要制定polor=True才能显示出极坐标图

@require_authorization
plt.subplot(1, 2, 2, polar=True)

N = 20
theta = np.arange(0.0, 2 * np.pi, 2 * np.pi / N )
radii = 10 * np.random.rand(N)
width = np.pi / 4 * np.random.rand(N)
bars = plt.bar(theta, radii, width=width, bottom=0.0)

for r, bar in zip(radii, bars):
    bar.set_facecolor(plt.cm.jet(r/10.))
    bar.set_alpha(0.5)

ax.set_xticklabels([])
ax.set_yticklabels([])

这里写图片描述

### Matplotlib基本绘图操作 Matplotlib 是 Python 中用于绘制图表的强大库。以下是关于如何使用 `matplotlib` 进行基本绘图的一些指导。 #### 创建简单的折线图 为了创建一条简单折线图,可以先导入必要的模块并定义数据集: ```python import numpy as np import matplotlib.pyplot as plt x = np.linspace(0, 4 * np.pi) # 生成 x 轴的数据 y = np.sin(x) # 计算对应的 y 值 plt.plot(x, y, label=r"$\sin(x)$") # 使用 LaTeX 表达式作为标签 plt.title('Sine Wave') plt.xlabel('Angle [radians]') plt.ylabel('sin(x)') plt.legend() plt.grid(True) plt.show() ``` 这段代码展示了怎样通过调用 `plot()` 函数来画出正弦波形,并设置了图形标题、坐标轴名称以及显示网格等功能[^3]。 #### 子图布局管理 当需要在同一窗口内展示多个子图时,可利用 `subplots()` 或者单独的 `subplot()` 方法实现多面板布局: ```python fig, ((ax1, ax2), (ax3, ax4)) = plt.subplots(nrows=2, ncols=2) # 在不同位置上添加四个独立的小图 for i, axis in enumerate([ax1, ax2, ax3]): axis.plot(np.random.rand(10)) # 特定设置第四个子图为共享 Y 轴比例尺的例子 ax4.plot(np.arange(10), 'o-', color='red', markersize=8) ax4.set_title('Shared Y Axis with Ax3') ax4.sharey(ax3) plt.tight_layout() # 自动调整各子图间距防止重叠 plt.show() ``` 这里介绍了两种方式构建包含两个以上子图的对象;其中特别指出了第四张图片与第三张共享相同的Y轴范围[^2]。 #### 配置全局样式属性 对于整个项目的可视化风格统一化处理,可以通过修改 rc 参数来自定义线条宽度、颜色方案等外观特性: ```python from cycler import cycler plt.rc('lines', linewidth=2.5) plt.rc('axes', prop_cycle=(cycler(color=['tab:green', 'tab:red']))) plt.figure(figsize=(9, 6)) t = np.linspace(-np.pi, np.pi, 100) s = t ** 2 / 2. plt.plot(t, s, marker=".", linestyle="-.") plt.title("Customized Line Style Example") plt.show() ``` 上述脚本更改了默认线条粗细度循环使用的色彩序列,从而影响后续所有新建立的 Axes 实例中的线条表现形式。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值