我想要的是非常简单的。我有一个名为“logo.png”的小图像文件,我希望在我的图的左上角显示。但是你无法在matplotlib的示例库中找到任何示例
我正在使用django,我的代码是这样的
def get_bars(request)
...
fig = Figure(facecolor='#F0F0F0',figsize=(4.6,4))
...
ax1 = fig.add_subplot(111,ylabel="Valeur",xlabel="Code",autoscale_on=True)
ax1.bar(ind,values,width=width, color='#FFCC00',edgecolor='#B33600',linewidth=1)
...
canvas = FigureCanvas(fig)
response = HttpResponse(content_type='image/png')
canvas.print_png(response)
return response
任何想法? thxs提前
答案 0 :(得分:36)
如果您希望图像位于实际图形的角落(而不是轴的一角),请查看figimage
。
也许是这样的? (使用PIL读取图像):
import matplotlib.pyplot as plt
import Image
import numpy as np
im = Image.open('/home/jofer/logo.png')
height = im.size[1]
# We need a float array between 0-1, rather than
# a uint8 array between 0-255
im = np.array(im).astype(np.float) / 255
fig = plt.figure()
plt.plot(np.arange(10), 4 * np.arange(10))
# With newer (1.0) versions of matplotlib, you can
# use the "zorder" kwarg to make the image overlay
# the plot, rather than hide behind it... (e.g. zorder=10)
fig.figimage(im, 0, fig.bbox.ymax - height)
# (Saving with the same dpi as the screen default to
# avoid displacing the logo image)
fig.savefig('/home/jofer/temp.png', dpi=80)
plt.show()
另一种选择,如果你想让图像成为图形宽度/高度的固定部分,那就是创建一个“虚拟”轴并用imshow
将图像放在其中。这样,图像的大小和位置与DPI和图形的绝对大小无关:
import matplotlib.pyplot as plt
from matplotlib.cbook import get_sample_data
im = plt.imread(get_sample_data('grace_hopper.jpg'))
fig, ax = plt.subplots()
ax.plot(range(10))
# Place the image in the upper-right corner of the figure
#--------------------------------------------------------
# We're specifying the position and size in _figure_ coordinates, so the image
# will shrink/grow as the figure is resized. Remove "zorder=-1" to place the
# image in front of the axes.
newax = fig.add_axes([0.8, 0.8, 0.2, 0.2], anchor='NE', zorder=-1)
newax.imshow(im)
newax.axis('off')
plt.show()
答案 1 :(得分:1)
现在有一个更简单的方法,使用新的 inset_axes
命令(需要 matplotlib >3.0)。
此命令允许将一组新轴定义为现有 axes
对象的子项。这样做的好处是您可以使用适当的 transform
表达式以任何您喜欢的单位定义插入轴,例如轴分数或数据坐标。
这是一个代码示例:
# Imports
import matplotlib.pyplot as plt
import matplotlib as mpl
# read image file
with mpl.cbook.get_sample_data(r"C:\path\to\file\image.png") as file:
arr_image = plt.imread(file, format='png')
# Draw image
axin = ax.inset_axes([105,-145,40,40],transform=ax.transData) # create new inset axes in data coordinates
axin.imshow(arr_image)
axin.axis('off')
这种方法的优点是您的图像会随着轴的重新缩放而自动缩放!