在matplotlib中将图像作为极坐标散点图的背景绘制

3
我正在编写一个镖机器人程序。已经计算出了机器人击中靶板的位置,现在我想使用matplotlib进行可视化。
我已有的是: 使用常规的极坐标投影显示机器人击中靶板的位置,并带有轴和其他内容。
我需要的是: 将镖靶设置为背景,并在其上绘制X&Y(或theta & r)。
我尝试过: 将我的代码片段与以下问题的接受答案连接起来:Plot polar plot on top of image? 这是我现在的代码:
import numpy as np
from matplotlib import pyplot as plt

# throw three darts:
rad = np.asarray([10000, 11000, 9400]) # consider these as distances from bull's eye in 10*µm
azi = np.asarray([352, 0, 10]) # in degrees
azi = np.deg2rad(azi) # conversion into radians

fig = plt.gcf()

axes_coords = [0, 0, 1, 1] # plotting full width and height

ax_polar = fig.add_axes(axes_coords, projection='polar')
ax_polar.patch.set_alpha(0)
ax_polar.scatter(azi, rad)
ax_polar.set_ylim(0, 17000)
ax_polar.set_xlim(0, 2*np.pi)
ax_polar.set_theta_offset(0.5*np.pi) # 0° should be on top, not right
ax_polar.set_theta_direction(direction=-1) # clockwise

plt.show()

以上代码运行正常。如果您运行它,您会看到机器人击中了靠近T20区的目标,该区域位于靶心正上方。

现在,如果我想添加图像,则需要在plt.show()之前插入以下代码:

pic = plt.imread('Board_cd.png')
ax_image = fig.add_axes(axes_coords)
ax_image.imshow(pic, alpha=.5)
ax_image.axis('off')  # don't show the axes ticks/lines/etc. associated with the image

图片看起来是这样的: Dartboard 但结果并不令人满意: enter image description here 我做错了什么?

不深入研究代码,我觉得这与如何将轮盘背景图像添加到matplotlib雷达图中类似。 - ImportanceOfBeingErnest
谢谢您的建议!不幸的是,对于我来说,您发布的问题的解决方案是通过matplot本身重新创建背景,这在我的情况下几乎不可能... - offeltoffel
我猜如果你因为某些原因不想这样做,那么说出来也没关系;但是这是完全可能的。 - ImportanceOfBeingErnest
好的,一个没有图像的解决方案总是更受欢迎。也许我会深入挖掘这个问题,但目前我不认为我能够应对这个任务。但你说得对 - 我应该记住这件事! - offeltoffel
1个回答

2

运行您在问题中展示的代码,应该会收到一个警告。

MatplotlibDeprecationWarning: 使用与先前axes相同的参数添加axes当前将重用较早的实例。在将来的版本中,将始终创建并返回新实例。同时,可以通过为每个axes实例传递唯一标签来抑制此警告并确保未来的行为。

解决方案已经在警告中给出,即为axes赋予唯一标签,例如:

ax_polar = fig.add_axes(axes_coords, projection='polar', label="ax polar")
# ...
ax_image = fig.add_axes(axes_coords, label="ax image")

产生的飞镖板应该看起来像这样:

enter image description here


我没有收到任何警告...这很奇怪。目前正在使用Anaconda Python 3.6.4在PyCharm中。无论如何,解决方案非常好,似乎完美地工作!从现在开始,我将能够进行微调。谢谢! - offeltoffel
我发现那个信息真的很令人困惑,第一个轴有 projection='polar' 而第二个没有,所以有人可能会认为它们没有相同的参数... 无论如何,我建议使用 zorder(例如在第二个 add_axes 调用中使用 zorder=-99)而不是 label,这样你就可以得到不同的参数和正确的 z 堆叠轴。 - filippo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接