给定一个pandas数据帧,我有一些代码可以创建散点图并在每个点放置指定的png:
import matplotlib.pyplot as plt
from matplotlib.image import BboxImage
from matplotlib.transforms import Bbox, TransformedBbox
threshold = 0.05
fig = plt.figure(figsize=(20,20))
ax = fig.add_subplot(111)
bound = 0.2
ax.set_xlim([-bound,bound])
ax.set_ylim([-bound,0.25])
ax.set_axis_bgcolor('white')
for index, row in high_low.iterrows():
x = row['row1']
y = row['row2']
if abs(x) > threshold or abs(y) > threshold:
im = plt.imread('/path/to/my/image_' + str(index) + '.png')
bb = Bbox.from_bounds(x,y,.01,.01)
bb2 = TransformedBbox(bb,ax.transData)
bbox_image = BboxImage(bb2,
norm = None,
origin=None,
clip_on=False,
alpha=0.75)
bbox_image.set_data(im)
ax.add_artist(bbox_image)
ax.grid(True, color="black", linestyle="--")
plt.savefig("myfig.svg", dpi=300, format='svg')
我想把这个图改成极坐标,所以我添加了以下函数
^{pr2}$把我的代码改成:
ax = fig.add_subplot(111, polar=True) # <- CHANGE HERE
ax.set_axis_bgcolor('white')
for index, row in high_low.iterrows():
x = row['row1']
y = row['row2']
if abs(x) > threshold or abs(y) > threshold:
rho, phi = cart2pol(x, y) # <- CHANGE HERE
im = plt.imread('/path/to/my/image_' + str(index) + '.png')
bb = Bbox.from_bounds(rho,phi,.01,.01) # <- CHANGE HERE
bb2 = TransformedBbox(bb,ax.transData)
bbox_image = BboxImage(bb2,
norm = None,
origin=None,
clip_on=False,
alpha=0.75)
bbox_image.set_data(im)
ax.add_artist(bbox_image)
ax.grid(True, color="black", linestyle="--")
plt.savefig("myfigPolar.pdf", dpi=300, format='pdf')
循环运行:
...
<matplotlib.image.BboxImage object at 0x7f6b805fb390>
<matplotlib.image.BboxImage object at 0x7f6b805fb6d0>
<matplotlib.image.BboxImage object at 0x7f6b805fba10>
...
但我在绘制时遇到了以下错误:
>>> plt.savefig("myfigPolar.pdf", dpi=300, format='pdf')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/lib/pymodules/python2.7/matplotlib/pyplot.py", line 561, in savefig
return fig.savefig(*args, **kwargs)
File "/usr/lib/pymodules/python2.7/matplotlib/figure.py", line 1421, in savefig
self.canvas.print_figure(*args, **kwargs)
File "/usr/lib/pymodules/python2.7/matplotlib/backend_bases.py", line 2220, in print_figure
**kwargs)
File "/usr/lib/pymodules/python2.7/matplotlib/backend_bases.py", line 1952, in print_pdf
return pdf.print_pdf(*args, **kwargs)
File "/usr/lib/pymodules/python2.7/matplotlib/backends/backend_pdf.py", line 2352, in print_pdf
self.figure.draw(renderer)
File "/usr/lib/pymodules/python2.7/matplotlib/artist.py", line 55, in draw_wrapper
draw(artist, renderer, *args, **kwargs)
File "/usr/lib/pymodules/python2.7/matplotlib/figure.py", line 1034, in draw
func(*args)
File "/usr/lib/pymodules/python2.7/matplotlib/artist.py", line 55, in draw_wrapper
draw(artist, renderer, *args, **kwargs)
File "/usr/lib/pymodules/python2.7/matplotlib/axes.py", line 2086, in draw
a.draw(renderer)
File "/usr/lib/pymodules/python2.7/matplotlib/artist.py", line 55, in draw_wrapper
draw(artist, renderer, *args, **kwargs)
File "/usr/lib/pymodules/python2.7/matplotlib/image.py", line 1182, in draw
im = self.make_image(renderer, image_mag)
File "/usr/lib/pymodules/python2.7/matplotlib/image.py", line 1172, in make_image
im.resize(int(widthDisplay), int(heightDisplay),
ValueError: cannot convert float NaN to integer
不知道我做错了什么。rho
和{Nan
,也不是超小的浮点(我在其他Stackoverflow答案中看到了这一错误)。在
编辑:回应要求plt.show()
的评论
Exception in Tkinter callback
Traceback (most recent call last):
File "/usr/lib/python2.7/lib-tk/Tkinter.py", line 1489, in __call__
return self.func(*args)
File "/usr/lib/pymodules/python2.7/matplotlib/backends/backend_tkagg.py", line 276, in resize
self.show()
File "/usr/lib/pymodules/python2.7/matplotlib/backends/backend_tkagg.py", line 348, in draw
FigureCanvasAgg.draw(self)
File "/usr/lib/pymodules/python2.7/matplotlib/backends/backend_agg.py", line 451, in draw
self.figure.draw(self.renderer)
File "/usr/lib/pymodules/python2.7/matplotlib/artist.py", line 55, in draw_wrapper
draw(artist, renderer, *args, **kwargs)
File "/usr/lib/pymodules/python2.7/matplotlib/figure.py", line 1034, in draw
func(*args)
File "/usr/lib/pymodules/python2.7/matplotlib/artist.py", line 55, in draw_wrapper
draw(artist, renderer, *args, **kwargs)
File "/usr/lib/pymodules/python2.7/matplotlib/axes.py", line 2086, in draw
a.draw(renderer)
File "/usr/lib/pymodules/python2.7/matplotlib/artist.py", line 55, in draw_wrapper
draw(artist, renderer, *args, **kwargs)
File "/usr/lib/pymodules/python2.7/matplotlib/image.py", line 1182, in draw
im = self.make_image(renderer, image_mag)
File "/usr/lib/pymodules/python2.7/matplotlib/image.py", line 1172, in make_image
im.resize(int(widthDisplay), int(heightDisplay),
ValueError: cannot convert float NaN to integer
rho
和phi
的最小值和最大值
>>> min(rho), max(rho)
(0.10336371748137782, 0.22005286472537541)
>>> min(phi), max(phi)
(-2.9088677009635697, 1.3618299263576035)
显然你需要把正角度传给Bbox。这应该是有效的:
相关问题 更多 >
编程相关推荐