Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/353.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在Matplotlib中子地块的角点和不同子地块内的点之间绘制直线_Python_Matplotlib - Fatal编程技术网

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()
我对线路的起点和终点有两个问题(它们可能相关):

  • 中的行不完全在底部子地块中应该结束的位置结束。它们的每一端都应该位于红色三角形的中心,但是它们会向左偏移一点
  • 这些线并不完全终止于它们开始的子地块的拐角处。如果仔细观察图d的底角,可以看到这一点。和f
  • 新推出的新产品将更优雅地解决您的问题

    以下代码应与您的原始帖子等效(注意未测试):


    我喜欢你对完美主义的执着。我认为问题在于,您正在做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()