Ivá*_*ván 5 python plot image matplotlib
我想要的是使用指定的函数或线条来创建图像的边框,然后在边框内放置自定义图像。
我使用填充之间作为示例,但也许有更简单的方法来实现此目的。这就是我的想法:
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(0,100,1000)
y = (3 + np.sin(x/5.)) * np.exp(-abs(x-50)/25.)*10
x2 = np.linspace(20,40,1000)
y2 = np.sqrt(100 - (x2 - 30)**2) + 40
y3 = -np.sqrt(100 - (x2 - 30)**2) + 40
plt.figure()
ax1 = plt.subplot(1,1,1, aspect='equal')
plt.fill_between(x=x, y1=y, y2=0, alpha=0.5, color='orange', linewidth=3)
plt.fill_between(x=x2, y1=y2, y2=y3, alpha=0.5, color='green', linewidth=3)
ax1.axis('off')
Run Code Online (Sandbox Code Playgroud)
该代码的输出是这个图像,我有:

我想要这样的东西,我想要的:

请记住,我希望在图像周围有一个边框,以便我可以自定义它,如果我有多个边框fillbetween,我可以选择在不同曲线内放置什么内容。另外,如果可以尊重图像的轴比,那么当我将其放置在绘图中时,其形状不会扭曲。
有很多不同的方法可以获取裁剪为某种形状的图像。我个人喜欢使用 an OffsetImageinside an AnnotationBbox。在下面的解决方案中,aPatch用作clip_path图像的 a。如果函数的输入是 a Path,则首先将其转换为补丁。
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.path import Path
from matplotlib.patches import PathPatch
from matplotlib.offsetbox import OffsetImage, AnnotationBbox
plt.figure()
ax1 = plt.subplot(1,1,1, aspect='equal')
ax1.axis('off')
def img_to_path( fn, path, zoom=0.72, ax = None, **kwargs):
if ax==None: ax=plt.gca()
kwargs.pop("facecolor", None)
im = plt.imread(fn, format='png')
if type(path) == Path:
xmin = path.vertices[:,0].min()
ymin = path.vertices[:,1].min()
patch = PathPatch(path, facecolor='none', zorder=3, **kwargs)
else:
patch = path
xmin = patch.get_verts()[:,0].min()
ymin = patch.get_verts()[:,1].min()
ax.add_patch(patch)
imagebox = OffsetImage(im, zoom=zoom, clip_path=patch, zorder=-10)
boxoffset = np.array(im.shape[:2][::-1])/2.*zoom
ab = AnnotationBbox(imagebox, (xmin,ymin), xycoords='data',
xybox=boxoffset, boxcoords="offset points",
pad=0, frameon=False)
ax.add_artist(ab)
# two images
fn1 = "data/raspberries.png"
fn2 = "data/blueberries.png"
# use a Path
x = np.linspace(0,100,1000)
y = (3 + np.sin(x/5.)) * np.exp(-abs(x-50)/25.)*10
x = np.append(x,[x[-1],x[0], x[0]])
y = np.append(y,[0,0,y[0]])
path = Path(np.c_[x,y], [1]+[2]*(len(x)-2)+[79])
img_to_path(fn1, path, edgecolor="red", lw=4, ax=ax1 )
# use a Patch
circ = plt.Circle((30,40), 10, edgecolor="gold", lw=13, zorder=3 )
img_to_path(fn2, circ, zoom=0.15, ax=ax1 )
ax1.relim()
ax1.autoscale_view()
plt.show()
Run Code Online (Sandbox Code Playgroud)