我正在努力在matplotlib中实现一个简单的目标...我想在我的图表的右下角放一个小的标志或指示器,而不改变轴或正在显示的真实数据。下面是我的代码:
fig = plt.figure()
plt.rcParams.update({'font.size': 15})
img = plt.imread('./path/to/image.png')
ax1 = fig.add_subplot(111)
ax1.yaxis.tick_left()
ax1.tick_params(axis='y', colors='black', labelsize=15)
ax1.tick_params(axis='x', colors='black', labelsize=15)
plt.grid(b=True, which='major', color='#D3D3D3', linestyle='-')
plt.scatter([1,2,3,4,5],[5,4,3,2,1], alpha=1.0)
plt.autoscale(enable=True, axis=u'both')
fig.savefig('figure.png')我的输出如下所示。
这是现在放置在整个图表上的照片--我希望它缩放到宽度和高度的20% (如果可能的话),并锚定在右下角。这也破坏了我的轴,因为在这个输出中,我应该在x和y上都在0-100的范围内。
Edit1:我已经尝试了下面的解决方案,并在这里链接了问题。问题是依赖于传递给imshow()的extent变量,然后在引入新数据时就不能很好地工作。例如,绘制来自数据框的散点图,可能是从0..1000到50..100,但使用范围不会显示标签或位置将为off。
Edit2:使用fig.get_size_inches()获取图形长度并将变量传递给extent似乎有一些进展。显然,所有matplotlib图的计算都是以英寸为单位的,所以这可能是一个有希望的线索。

发布于 2015-04-10 14:38:25
import matplotlib.image as image
import matplotlib.pyplot as plt
im = image.imread('debian-swirl.png')
fig, ax = plt.subplots()
ax.imshow(im, aspect='auto', extent=(0.4, 0.6, .5, .7), zorder=-1)
ax.yaxis.tick_left()
ax.tick_params(axis='y', colors='black', labelsize=15)
ax.tick_params(axis='x', colors='black', labelsize=15)
ax.grid(b=True, which='major', color='#D3D3D3', linestyle='-')
ax.scatter([1,2,3,4,5],[5,4,3,2,1], alpha=1.0)
plt.show()

我在左下角添加了一个png文件。调整范围参数以设置徽标位置。
发布于 2018-01-16 18:58:28
以下是Kirubaharan J的答案的改编,但根据图表的范围调整标志的位置(但不保留标志本身的纵横比)
import matplotlib.image as image
import matplotlib.pyplot as plt
im =image.imread('debian-swirl.png')
fig, ax = plt.subplots()
ax.yaxis.tick_left()
ax.tick_params(axis='y', colors='black', labelsize=15)
ax.tick_params(axis='x', colors='black', labelsize=15)
ax.grid(b=True, which='major', color='#D3D3D3', linestyle='-')
ax.scatter( [100,90,89,70], [55, 23,76,29], alpha=1.0)
plt.autoscale(enable=True, axis=u'both')
xrng=plt.xlim()
yrng=plt.ylim()
scale=.2 #the image takes this fraction of the graph
ax.imshow(im,aspect='auto',extent=(xrng[0],xrng[0] + scale*(xrng[1]-xrng[0]), yrng[0], yrng[0] + scale*(yrng[1]-yrng[0]) ), zorder=-1)
plt.xlim(xrng)
plt.ylim(yrng)
plt.show()发布于 2020-03-17 22:11:16
我解决了一个类似的问题,在每个页面上打印了几个pdf,每个页面上都有一个固定的徽标,独立于图形大小。我发现最好的解决方案是使用GridSpec。
fig = plt.figure(figsize = (11,8.5)) # 8.5" x 11" : letter format
G = plt.GridSpec(14,21)我的案例是在一个8.5x11英寸的模板上构建一个14 * 21的网格。然后,我只需要为徽标分配网格的一部分,并使用matplotlib.image导入它
ax = fig.add_subplot(G[2:5,5:14])
logo = mpimg.imread("logo.png")
imagebox = OffsetImage(logo, zoom=0.08)
ab = AnnotationBbox(imagebox, (0.4, 0.6), frameon = False)
ax.add_artist(ab)您可以在OffsetImage中使用zoom参数控制缩放。您可以在以下链接中找到详细信息:
https://stackoverflow.com/questions/29548704
复制相似问题