【问题】Mac的Python使用Matplotlib不能实时绘制图像|只能看到白板

问题描述

使用实时绘图的时候不能看到图像
在这里插入图片描述

示例的问题代码:

import  matplotlib
import matplotlib.pyplot as plt
import numpy as np


# 创建一个图形窗口和一个子图对象
fig, ax = plt.subplots()
plt.ion()  # 打开交互模式,允许在图形窗口中实时更新数据

# 创建一个空白的线条对象
line, = ax.plot([], [])

# 设置子图的属性
# ax.set_xlim(0, 1000)
# ax.set_ylim(0, 1000)
ax.set_title('Random Number')
ax.set_xlabel('Time')
ax.set_ylabel('Value')

rand_list=[]
rand_num=0

# 开始循环
while rand_num<1000:
    # 生成一个随机数
    rand_num +=1
    rand_list.append(rand_num)

    ax.set_xlim(0, rand_num)
    ax.set_ylim(0, rand_num)
    # 更新线条对象的数据
    line.set_data(np.arange(len(rand_list)), np.array(rand_list))
    # 更新图形窗口
    fig.canvas.draw()
    plt.pause(0.1)
    print(f'yes!{rand_num}')

解决方法

添加一行代码,就可以跑起来了

matplotlib.use('macosx')

完整代码如下

import  matplotlib
import matplotlib.pyplot as plt
import numpy as np

matplotlib.use('macosx')
# 你用TkAgg也是可以绘制的
# matplotlib.use('TkAgg')

# 创建一个图形窗口和一个子图对象
fig, ax = plt.subplots()
plt.ion()  # 打开交互模式,允许在图形窗口中实时更新数据

# 创建一个空白的线条对象
line, = ax.plot([], [])

# 设置子图的属性
# ax.set_xlim(0, 1000)
# ax.set_ylim(0, 1000)
ax.set_title('Random Number')
ax.set_xlabel('Time')
ax.set_ylabel('Value')

rand_list=[]
rand_num=0

# 开始循环
while rand_num<1000:
    # 生成一个随机数
    rand_num +=1
    rand_list.append(rand_num)

    ax.set_xlim(0, rand_num)
    ax.set_ylim(0, rand_num)
    # 更新线条对象的数据
    line.set_data(np.arange(len(rand_list)), np.array(rand_list))
    # 更新图形窗口
    fig.canvas.draw()
    plt.pause(0.1)
    print(f'yes!{rand_num}')

效果
在这里插入图片描述

问题原因

这里实时显示图形的问题是因为Matplotlib后端设置不正确,可能一般windows上不会有这个问题,因为其默认使用的agg后端在windows上兼容。但是mac上使用agg就会出问题。

常见的几种后端如下

Agg:Anti-Grain Geometry (AGG)是一个用于生成高质量矢量图形的C++库,Agg后端利用该库来生成PNG、PS和PDF格式的图像。由于该后端不支持交互式绘图,因此常用于生成静态图像。

Cairo:Cairo是一个用于生成高质量矢量图形的开源库,它支持生成PNG、PS、PDF和SVG格式的图像。Cairo后端通过调用Cairo库来实现图像的绘制,生成的图像质量很高,而且支持各种字体和线型,但在绘制大量数据时可能会比较慢。

QtAgg:该后端基于Qt GUI框架,可以实现交互式绘图。使用该后端,可以在Matplotlib窗口中进行缩放、平移和旋转等操作,并且可以在图形中添加按钮、菜单和文本框等组件。需要安装Qt库和Python Qt绑定,如PyQt5或PySide2等。

GTKAgg:该后端基于GTK GUI框架,可以实现交互式绘图。使用该后端,可以在Matplotlib窗口中进行缩放、平移和旋转等操作,并且可以在图形中添加按钮、菜单和文本框等组件。需要安装GTK+库和Python GTK绑定,如PyGObject等。

WXAgg:该后端基于WX GUI框架,可以实现交互式绘图。使用该后端,可以在Matplotlib窗口中进行缩放、平移和旋转等操作,并且可以在图形中添加按钮、菜单和文本框等组件。需要安装wxWidgets库和Python WX绑定,如wxPython等。

TkAgg:该后端基于Tkinter GUI框架,提供了实时绘图和交互式GUI的功能。使用该后端,可以在Matplotlib窗口中进行缩放、平移和旋转等操作,并且可以在图形中添加按钮、菜单和文本框等组件。由于Tkinter库是Python自带的,因此该后端是Matplotlib默认的后端。

MacOSX:该后端是适用于MacOS X平台的后端,可以实现交互式的绘图。使用该后端,可以在Matplotlib窗口中进行缩放、平移和旋转等操作,并且可以在图形中添加按钮、菜单和文本框等组件。该后端支持Retina显示,并且可以使用苹果电脑自带的字体。

WebAgg:该后端可以将绘图输出到Web浏览器中,支持HTML5和WebSocket技术。使用该后端,可以将Matplotlib图形嵌入到wxPython应用程序中。

用代码查看具体的后端模块

更具体地,你可以到matplotlib.backends模块中去查看各种不同后端的具体实现

# 使用如下代码打印你的后端模块
import matplotlib.backends as be
import os


be_dir = be.__path__[0]
print(be_dir)

for root, dirs, files in os.walk(be_dir):
    level = root.replace(be_dir, '').count(os.sep)
    indent = ' ' * 4 * (level)
    print(f"{indent}{os.path.basename(root)}/")
    subindent = ' ' * 4 * (level + 1)
    for f in files:
        print(f"{subindent}{f}")

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 首先,需要安装matplotlib库,在命令行中输入pip install matplotlib即可安装。 然后,在代码中导入matplotlib库: ``` import matplotlib.pyplot as plt ``` 读取文件的方式有很多种,这里以读取csv文件为例: ``` import csv x = [] y = [] # 使用csv模块读取数据 with open('data.csv', 'r') as csv_file: csv_reader = csv.reader(csv_file) # 跳过表头 next(csv_reader) for row in csv_reader: x.append(int(row[0])) y.append(int(row[1])) ``` 然后,使用matplotlib的plot函数绘制折线图: ``` plt.plot(x, y) plt.show() ``` 如果需要保存图片,可以使用savefig函数: ``` plt.savefig('figure.png') ``` 注意:上面的代码假设数据文件是这样的: ``` x,y 1,2 2,3 3,4 4,5 5,6 ``` 这是一个简单的例子,关于matplotlib的用法还有很多其他细节,详情可以参考官方文档:https://matplotlib.org/stable/index.html ### 回答2: Python可以使用matplotlib库读取文档并绘制折线图。 首先,需要安装matplotlib库。在命令行中输入以下命令: pip install matplotlib 安装完成后,在Python的脚本中引入matplotlib库: import matplotlib.pyplot as plt 接下来,需要读取文档中的数据。假设文档中的数据是一组x和y的坐标点,可以使用以下代码读取: x = [] y = [] with open('data.txt', 'r') as file: lines = file.readlines() for line in lines: values = line.split() # 假设数据以空格分隔 x.append(float(values[0])) # 假设x数据在第一列 y.append(float(values[1])) # 假设y数据在第二列 读取完成后,就可以使用matplotlib绘制折线图了。以下是一个简单的绘制折线图的例子: plt.plot(x, y) plt.xlabel('X') plt.ylabel('Y') plt.title('折线图') plt.show() 通过调用plt.plot()函数,传入x和y坐标数据,可以绘制出折线图。接着,可以使用plt.xlabel()和plt.ylabel()设置横轴和纵轴的标签,使用plt.title()设置图表的标题。最后,通过调用plt.show()显示绘制的折线图。 以上就是使用matplotlib库读取文档并绘制折线图的简单步骤。根据具体的需求和文档格式,还可以进行一些适当的调整和修改。 ### 回答3: Python使用matplotlib库可以读取文档中的数据,并根据这些数据绘制折线图。 首先,需要导入matplotlib库和相关的模块。一般来说,我们会使用`pyplot`模块来绘制图表,还有其他一些模块用于设置图表的样式、标签等。 接下来,我们需要读取包含数据的文档。可以使用Python的文件操作函数来读取文档,例如`open()`函数。 读取文档后,需要将数据解析成可供绘图使用的格式。常见的方式是使用`csv`模块来处理包含逗号分隔数据的文档,或者使用`pandas`库来处理包含表格数据的文档。 一旦数据被解析出来,我们可以使用`plot()`函数来绘制折线图。`plot()`函数接受两个参数,分别是X轴和Y轴的数据。根据需要,可以使用其他的参数来设置折线的样式、标签等。 绘制完折线图后,可以使用`show()`函数来展示图表。此时,可以对图表进行额外的设置,例如添加标题、X轴和Y轴标签,设置坐标轴的范围、刻度等。 最后,使用`savefig()`函数可以将绘制的折线图保存为图片,方便进一步使用或分享。 总之,Python使用matplotlib库读取文档并绘制折线图的基本流程是导入库和模块、读取文档、解析数据绘制折线图、展示并设置图表,可以根据具体需求和数据格式进行调整。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值