Plot中的Matplotlib Pyplot徽标/图像

时间:2015-04-09 20:49:12

标签: 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', 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&的0-100范围内。年。任何解决这个问题的想法,缩放都是一个大问题。

编辑1:我已经尝试了下面的解决方案,并将问题链接到SO上。问题是依赖于传递给extent的{​​{1}}变量,然后在引入新数据时效果不佳。例如,绘制来自数据框的散点图可以是0..1000和50..100但是使用范围不会显示标签或位置将关闭。

Edit2:使用imshow()获取数字长度并将变量传递给fig.get_size_inches()似乎取得了一些进展。显然所有的matplotlib图形计算都是通过英寸来完成的,所以这可能是一个很有希望的领先优势。

enter image description here

4 个答案:

答案 0 :(得分:5)

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()

enter image description here

我在左下角添加了一个png文件。调整范围参数以设置徽标位置。

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

答案 1 :(得分:3)

我已经解决了一个类似的问题,即在每页上打印几张带有固定徽标的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)

您可以使用zoom中的OffsetImage参数来控制比例 您可以在以下链接中找到详细信息:

https://www.science-emergence.com/Articles/How-to-insert-an-image-a-picture-or-a-photo-in-a-matplotlib-figure/

答案 2 :(得分:2)

以下是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()

答案 3 :(得分:0)

我认为最好将图像简单地放在一个新轴上... 这样你就可以完全控制把它放在哪里,而不必打扰现有的轴

import matplotlib.image as image
import matplotlib.pyplot as plt
# create a plot
f, ax = plt.subplots()

im = image.imread("path-to-logo.png")

# put a new axes where you want the image to appear
# (x, y, width, height)
imax = f.add_axes([0.8, 0.75, 0.1, 0.1])
# remove ticks & the box from imax 
imax.set_axis_off()
# print the logo with aspect="equal" to avoid distorting the logo
imax.imshow(im, aspect="equal")