首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Matplotlib Pyplot logo/image in Plot

Matplotlib Pyplot logo/image in Plot
EN

Stack Overflow用户
提问于 2015-04-10 04:49:12
回答 4查看 17.8K关注 0票数 5

我正在努力在matplotlib中实现一个简单的目标...我想在我的图表的右下角放一个小的标志或指示器,而不改变轴或正在显示的真实数据。下面是我的代码:

代码语言:javascript
复制
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图的计算都是以英寸为单位的,所以这可能是一个有希望的线索。

EN

回答 4

Stack Overflow用户

发布于 2015-04-10 14:38:25

代码语言:javascript
复制
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文件。调整范围参数以设置徽标位置。

类似于:Scale image in matplotlib without changing the axis

票数 5
EN

Stack Overflow用户

发布于 2018-01-16 18:58:28

以下是Kirubaharan J的答案的改编,但根据图表的范围调整标志的位置(但不保留标志本身的纵横比)

代码语言:javascript
复制
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()
票数 4
EN

Stack Overflow用户

发布于 2020-03-17 22:11:16

我解决了一个类似的问题,在每个页面上打印了几个pdf,每个页面上都有一个固定的徽标,独立于图形大小。我发现最好的解决方案是使用GridSpec

代码语言:javascript
复制
fig = plt.figure(figsize = (11,8.5)) # 8.5" x 11" : letter format
G = plt.GridSpec(14,21)

我的案例是在一个8.5x11英寸的模板上构建一个14 * 21的网格。然后,我只需要为徽标分配网格的一部分,并使用matplotlib.image导入它

代码语言:javascript
复制
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://www.science-emergence.com/Articles/How-to-insert-an-image-a-picture-or-a-photo-in-a-matplotlib-figure/

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29548704

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档