Python Matplotlib Pyplot绘图中的徽标/图像

Python Matplotlib Pyplot绘图中的徽标/图像,python,matplotlib,Python,Matplotlib,我正在努力在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', co

我正在努力在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,但使用范围不会显示标签或位置将处于禁用状态

Edit2:使用
fig.get_size\u inches()
获取体形长度,并将变量传递到
范围,似乎取得了一些进展。显然,所有matplotlib图形的计算都是通过英寸完成的,因此这可能是一个有希望的线索

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文件。调整“范围”参数以设置徽标位置


类似于:

以下是Kirubaharan J对答案的改编,但根据图形的范围调整了徽标的位置(但徽标本身的纵横比没有保留)


我曾经处理过一个类似的问题,即打印几个pdf,每个页面上都有一个固定的徽标,与图形大小无关。我找到的最佳解决方案是使用
GridSpec

fig = plt.figure(figsize = (11,8.5)) # 8.5" x 11" : letter format
G = plt.GridSpec(14,21)
我的案例是在8.5 x 11英寸的模板上构建一个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
您可以在以下链接中找到详细信息:


我认为最好将图像放在一个新的轴上。。。 通过这种方式,您可以完全控制将其放置在何处,而不必担心现有轴

将matplotlib.image导入为图像
将matplotlib.pyplot作为plt导入
#创建一个绘图
f、 ax=plt.子批次()
im=image.imread(“logo.png路径”)
#将新轴放置在希望图像显示的位置
#(x、y、宽度、高度)
imax=f.add_轴([0.8,0.75,0.1,0.1])
#从imax中删除复选框(&T)
imax.set_axis_off()
#使用aspect=“equal”打印徽标以避免扭曲徽标
imax.imshow(im,aspect=“equal”)

是否不可能将图像包含到绘图宽度和高度的20%,而不取决于数据?我希望能够不断地将此图像放在我创建的任何绘图上,使用此代码,我必须根据轴与新数据的比例调整“范围”因子。如果我将传入的数据更改为[100,90,89,70],[55,23,76,29],这将不再显示图像我还对使用轴的分数坐标(而不是整个图形)的答案感兴趣。我刚刚遇到了这个问题,在链接中使用AnnotationBbox是我找到的最佳解决方案
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)