Python从0到0.1_(matplotlib)

Python matplotlib图形绘制详解
这篇博客详细介绍了Python的matplotlib库在绘制图形方面的基本用法,包括直线图、散点图、直方图、等高线图和3D图的绘制,以及如何设置坐标轴、添加图例和图像标注,同时还探讨了子图像的两种布局方式和动态图的创建。

目录

基本用法

y = kx + b

绘制两个(y = x^2)

不同的图中

同一张图中

设置坐标轴

设置标签、限制显示区间

改变坐标轴尺度

改变坐标轴的边框和位置

图例

图像的标注

散点图

直方图

等高线图

3D 图

子图像

第一种布局方式

第二种布局方式

动态图


 

基本用法

y = kx + b

import numpy as np
import matplotlib.pyplot as plt

x = np.linspace(-1, 1, 100)
y = 2 * x + 1
plt.plot(x, y)
plt.show()

绘制两个(y = x^2)

不同的图中

import numpy as np
import matplotlib.pyplot as plt

x = np.linspace(-1, 1, 100)
y1 = 2 * x + 1
y2 = x ** 2
plt.figure(figsize=(4, 3))     # 这里定义了图像大小
plt.plot(x, y1)
plt.figure(figsize=(6, 4))
plt.plot(x, y2)
plt.show()

 

同一张图中

import numpy as np
import matplotlib.pyplot as plt

x = np.linspace(-1, 1, 100)
y1 = 2 * x + 1
y2 = x ** 2
plt.figure(figsize=(6, 4))     # 也可以不定义,默认显示在一个图像中
plt.plot(x, y1, color="red", linewidth=1.0, linestyle="--")
plt.plot(x, y2, color="blue", linewidth=3.0, linestyle="-")
plt.show()

设置坐标轴

设置标签、限制显示区间

import numpy as np
import matplotlib.pyplot as plt

x = np.linspace(-1, 1, 100)
y1 = 2 * x + 1
y2 = x ** 2

# 限制 x,y 的范围
plt.xlim(-1, 2)
plt.ylim(-2, 3)

# 对 x,y 描述
plt.xlabel("xxx")
plt.ylabel("yyy")

plt.plot(x, y1, color="red", linewidth=1.0, linestyle="--")
plt.plot(x, y2, color="blue", linewidth=3.0, linestyle="-")
plt.show()

改变坐标轴尺度

import numpy as np
import matplotlib.pyplot as plt

x = np.linspace(-1, 1, 100)
y1 = 2 * x + 1
y2 = x ** 2

# 设定坐标轴尺度
# 第一种
new
<think>我们遇到了一个AttributeError:'FigureCanvasInterAgg'objecthasnoattribute'tostring_rgb'的错误。根据引用[3],这个错误通常是由于PyCharm内置的Matplotlib后端与当前Matplotlib版本不兼容导致的。解决方法是显式指定兼容的后端。根据引用[3]的建议,我们可以尝试以下步骤:1.在代码开头显式设置Matplotlib的后端为TkAgg(或其他兼容的后端,如Agg)。这可以通过`matplotlib.use('TkAgg')`来实现。注意:设置后端必须在导入matplotlib.pyplot之前完成。2.如果上述方法无效,可以尝试升级或降级Matplotlib版本以解决兼容性问题。3.另外,根据引用[2],也可以尝试使用`tostring_argb`替代(但通常我们不需要直接调用这个方法,所以更可能是后端设置问题)。因此,我们可以在绘制神经网络学习过程图的代码中,在导入matplotlib之前先设置后端。以下是修改后的代码示例:```pythonimportmatplotlibmatplotlib.use('TkAgg')#或者尝试'Agg'、'Qt5Agg'等importmatplotlib.pyplotaspltfrommatplotlib.animationimportFuncAnimationimportnumpyasnp#模拟简单网络训练epochs=100loss_history=[]fig,ax=plt.subplots()defupdate(frame):#模拟损失下降(实际中替换为训练逻辑)loss=1/(frame+1)+np.random.rand()*0.1loss_history.append(loss)ax.clear()ax.plot(loss_history,'b-')ax.set_title(f'Epoch{frame}:Loss={loss:.4f}')ax.set_xlabel('Epoch')ax.set_ylabel('Loss')ani=FuncAnimation(fig,update,frames=epochs,repeat=False)plt.show()```如果使用`TkAgg`后端时出现与Tkinter相关的错误,可能是因为没有安装Tkinter。在这种情况下,可以尝试安装Tkinter(例如在Ubuntu上使用`sudoapt-getinstallpython3-tk`)或者换用其他后端,例如`Agg`(注意:`Agg`后端不支持交互式绘图,但可以生成动画文件)。另外,如果是在JupyterNotebook中运行,可能需要使用`%matplotlibinline`等魔术命令,但这里我们遇到的是在PyCharm中的错误。如果上述方法不能解决问题,还可以尝试升级Matplotlib:```bashpipinstall--upgradematplotlib```或者降级到较旧版本(例如3.3.4):```bashpipinstallmatplotlib==3.3.4```总结:主要解决方案是设置后端,并确保后端与当前环境兼容。§§相关问题§§1.如何检查当前Matplotlib的后端?2.如何解决使用TkAgg后端时出现的TclError?3.如何将Matplotlib动画保存为GIF或MP4文件?</think>### 解决 AttributeError: 'FigureCanvasInterAgg' object has no attribute 'tostring_rgb' 错误 这个错误通常是由于 Matplotlib 后端设置问题导致的,尤其是在 PyCharm 等 IDE 中使用交互式绘图时。以下是完整解决方案: #### 1. **问题原因分析** - 错误 `AttributeError: 'FigureCanvasInterAgg' object has no attribute 'tostring_rgb'` 表明 Matplotlib 的后端配置存在问题[^1][^2] - 根本原因是 PyCharm 内置的 Matplotlib 后端与当前版本不兼容[^3] - 常见于使用 `FuncAnimation` 或交互式图表时 #### 2. **解决方案步骤** **方法1:显式设置兼容后端(推荐)** ```python import matplotlib # 必须在导入pyplot之前设置后端 matplotlib.use('Agg') # 使用非交互式后端 # matplotlib.use('TkAgg') # 如果系统有Tkinter支持 import matplotlib.pyplot as plt from matplotlib.animation import FuncAnimation # 其余绘图代码保持不变... ``` **方法2:升级/降级 Matplotlib** ```bash # 升级到最新版 pip install --upgrade matplotlib # 或降级到兼容版本(如3.5.0) pip install matplotlib==3.5.0 ``` **方法3:修改 IDE 配置(PyCharm)** 1. 打开 PyCharm 设置:`File > Settings > Tools > Python Scientific` 2. 取消勾选 `Show plots in tool window` 3. 重启 PyCharm #### 3. **完整修复示例** ```python import matplotlib matplotlib.use('Agg') # 设置非交互式后端 import matplotlib.pyplot as plt from matplotlib.animation import FuncAnimation import numpy as np # 修复后的神经网络训练可视化 epochs = 100 loss_history = [] fig, ax = plt.subplots() def update(frame): # 模拟训练过程 loss = np.exp(-frame/20) + np.random.rand()*0.1 loss_history.append(loss) ax.clear() ax.plot(loss_history, 'r-', linewidth=2) ax.set_title(f'训练轮次: {frame+1}, 损失值: {loss:.4f}') ax.set_xlabel('训练轮次') ax.set_ylabel('损失函数') ax.grid(True) # 保存动画而非直接显示 ani = FuncAnimation(fig, update, frames=epochs, interval=100) ani.save('training_process.gif', writer='pillow') # 保存为GIF print("训练过程已保存为 training_process.gif") ``` #### 4. **关键注意事项** 1. **后端选择指南**: - `'Agg'`:最稳定的非交互式后端(适合保存文件) - `'TkAgg'`:交互式后端(需安装 `python3-tk` 包) - 避免使用 `'module://backend_interagg'`(PyCharm 默认) 2. **执行顺序要求**: - `matplotlib.use()` 必须在导入 `pyplot` 之前调用 - 否则设置不会生效 3. **替代方案**: ```python # 如果不需动画,改用静态图 plt.plot(loss_history) plt.savefig('training_static.png') ``` 4. **环境检查**: ```python import matplotlib print(matplotlib.get_backend()) # 查看当前后端 ``` #### 5. **验证解决方案** 修复后应该: 1. 不再出现 `tostring_rgb` 相关错误 2. 能够正常生成训练过程可视化 3. 在终端/文件系统中找到输出的 GIF 或图像文件 > **提示**:如果使用 Jupyter Notebook,添加 `%matplotlib inline` 魔法命令通常可避免此类问题[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值