Python 在Matplotlib中子地块的角点和不同子地块内的点之间绘制直线
我试图生成一个图形,其中线条从子地块的两个角延伸到不同子地块的一个点。我从阅读中获得了一些成功,但是由此产生的情节并不完全正确。我创建了一个简化的示例来说明我的问题Python 在Matplotlib中子地块的角点和不同子地块内的点之间绘制直线,python,matplotlib,Python,Matplotlib,我试图生成一个图形,其中线条从子地块的两个角延伸到不同子地块的一个点。我从阅读中获得了一些成功,但是由此产生的情节并不完全正确。我创建了一个简化的示例来说明我的问题 import numpy as np from matplotlib import gridspec,lines import matplotlib.pyplot as plt def corner_to_point(point_ax,corner_ax,point,corners,fig): transFigure =
import numpy as np
from matplotlib import gridspec,lines
import matplotlib.pyplot as plt
def corner_to_point(point_ax,corner_ax,point,corners,fig):
transFigure = fig.transFigure.inverted()
coord1 = transFigure.transform(point_ax.transData.transform(point))
for elem in corners:
x0,x1 = corner_ax.get_xlim()
y0,y1 = corner_ax.get_ylim()
if elem == 1: # upper left
c = [x0,y1]
elif elem == 2: # upper right
c = [x1,y1]
elif elem == 3: # lower right
c = [x1,y0]
else: # lower left
c = [x0,y0]
coord2 = transFigure.transform(corner_ax.transData.transform(c))
line = lines.Line2D((coord1[0],coord2[0]),
(coord1[1],coord2[1]),
transform=fig.transFigure,color='k')
fig.lines.append(line)
fig = plt.figure(figsize=(8,7.5))
# set up the figure layout
outer = gridspec.GridSpec(2,1,height_ratios = [2,1.5],
hspace = 0.2)
gs1 = gridspec.GridSpecFromSubplotSpec(2,3,
subplot_spec = outer[0],
hspace = 0.0,
wspace = 0.0)
gs2 = gridspec.GridSpecFromSubplotSpec(1,1, subplot_spec = outer[1])
xs = np.linspace(-np.pi,np.pi)
funcs = [np.sin,np.cos,np.tan,np.sinh,np.cosh,np.tanh]
labels = ['a','b','c','d','e','f']
grid = []
for i,func,label in zip(range(6),funcs,labels):
ax = plt.subplot(gs1[i])
ax.plot(xs,func(xs))
ax.axes.get_xaxis().set_visible(False)
ax.axes.get_yaxis().set_visible(False)
ax.text(0.05, 0.95, label,
verticalalignment='top', horizontalalignment='left',
transform=ax.transAxes,fontsize=15)
grid.append(ax)
ax2 = plt.subplot(gs2[0])
ax2.plot(xs,np.sin(xs), 'b-',
[-2.25,3],[0,0],'r^')
corner_to_point(ax2,grid[3],[-2.25,0],[3,4],fig)
corner_to_point(ax2,grid[5],[3,0],[3,4],fig)
plt.show()
我对线路的起点和终点有两个问题(它们可能相关):
我喜欢你对完美主义的执着。我认为问题在于,您正在做matplotlib没有预料到的事情,在轴外打印,因此
线。set_snap(True)
将不起作用(假设它无论如何都会起作用)。否则,可以根据1)符号大小和2)轴线厚度移动线端点。问题是获取此大小,由ms
/lw
指定,并受缩放等影响。保存为矢量图形格式(PDF)的三角形1)看起来不错,可能只是手动移动2)?像这样的方法可能更好。
import numpy as np
from matplotlib import gridspec,lines
import matplotlib.pyplot as plt
from matplotlib.patches import ConnectionPatch
def corner_to_point(point_ax,corner_ax,point,corners,fig):
transFigure = fig.transFigure.inverted()
coord1 = transFigure.transform(point_ax.transData.transform(point))
for elem in corners:
x0,x1 = corner_ax.get_xlim()
y0,y1 = corner_ax.get_ylim()
if elem == 1: # upper left
c = [x0,y1]
elif elem == 2: # upper right
c = [x1,y1]
elif elem == 3: # lower right
c = [x1,y0]
else: # lower left
c = [x0,y0]
coord2 = transFigure.transform(corner_ax.transData.transform(c))
'''
line = lines.Line2D((coord1[0],coord2[0]),
(coord1[1],coord2[1]),
transform=fig.transFigure,color='k')
fig.lines.append(line)
'''
xyA = (coord1[0], coord2[0])
xyB = (coord1[1], coord2[1])
con = ConnectionPatch(xyA=xyA, xyB=xyB, coordsA="data", coordsB="data",
axesA=corner_ax, axesB=point_ax, color="red")
corner_ax.add_artist(con)
fig = plt.figure(figsize=(8,7.5))
# set up the figure layout
outer = gridspec.GridSpec(2,1,height_ratios = [2,1.5],
hspace = 0.2)
gs1 = gridspec.GridSpecFromSubplotSpec(2,3,
subplot_spec = outer[0],
hspace = 0.0,
wspace = 0.0)
gs2 = gridspec.GridSpecFromSubplotSpec(1,1, subplot_spec = outer[1])
xs = np.linspace(-np.pi,np.pi)
funcs = [np.sin,np.cos,np.tan,np.sinh,np.cosh,np.tanh]
labels = ['a','b','c','d','e','f']
grid = []
for i,func,label in zip(range(6),funcs,labels):
ax = plt.subplot(gs1[i])
ax.plot(xs,func(xs))
ax.axes.get_xaxis().set_visible(False)
ax.axes.get_yaxis().set_visible(False)
ax.text(0.05, 0.95, label,
verticalalignment='top', horizontalalignment='left',
transform=ax.transAxes,fontsize=15)
grid.append(ax)
ax2 = plt.subplot(gs2[0])
ax2.plot(xs,np.sin(xs), 'b-',
[-2.25,3],[0,0],'r^')
corner_to_point(ax2,grid[3],[-2.25,0],[3,4],fig)
corner_to_point(ax2,grid[5],[3,0],[3,4],fig)
plt.show()