>

다음을 올바르게 그리는 방법을 찾으려고 노력하고 있습니다.

2 개의 노드, 즉 R ^ 2에 2 포인트, 즉 src = (x1, y1) 및 dst = (x2, y2)가 있다고 가정하겠습니다.

상자 사이에서 가장자리/선을 그리고 싶습니다.

Tikz로 만든 예제입니다 :

src와 dest는이 노드들의 중심입니다. 또한 높이가 다를 수 있습니다. 문제는 (patch.Rectangle을 사용하여) 상자를 만들려고 할 때 회전해야 크기가 바뀌는 것입니다.

미리 감사합니다


  • 답변 # 1

    회전 된 사각형을 스틱으로 사용하여 그래프에 채워진 사각형을 사용하려면 그래프 가장자리의 산란 점만큼 두꺼운 간단한 선으로 에뮬레이션 할 수 있습니다.

    import matplotlib.pyplot as plt
    import numpy as np
    def plot_spec_line(src, dst, length=0.3, srctext="v", dsttext="w", 
                       ax=None, color="k", textcolor="k"):
        if not ax: ax=plt.gca()
        lend=src+(dst-src)*length
        ax.plot([src[0],lend[0]], [src[1],lend[1]], lw=24,solid_capstyle="butt", zorder=1, color=color )
        ax.plot([src[0],dst[0]], [src[1],dst[1]], lw=2,solid_capstyle="butt", zorder=0, color=color)
        ax.scatter([src[0],dst[0]], [src[1],dst[1]], s=24**2, marker="o", lw=2, edgecolors=color, c="w", zorder=2)
        ax.text(src[0],src[1], srctext, fontsize=12, ha="center", va="center", zorder=3, color=textcolor)
        ax.text(dst[0],dst[1], dsttext, fontsize=12, ha="center", va="center", zorder=3, color=textcolor)
    s = np.array([1,1])
    d = np.array([3,2])    
    plot_spec_line(s, d, length=0.3, srctext="v", dsttext="w")
    s = np.array([1.5,0.9])
    d = np.array([2.8,1.2])    
    plot_spec_line(s, d, length=0.2, srctext="a", dsttext="b", color="gray")
    s = np.array([1,2])
    d = np.array([2,1.9])    
    plot_spec_line(s, d, length=0.7, srctext="X", dsttext="Y", textcolor="limegreen", color="limegreen")
    plt.margins(0.2)
    plt.show()
    
    

    <시간> 채워지거나 더 중요하지 않은 가장자리를 가진 사각형을 얻으려면 Rectangle 를 사용할 수 있습니다 . 적절한 변형을 설정하여 사각형을 회전 할 수 있습니다. 그런 다음 사각형과 원이 비뚤어지지 않도록 동일한 종횡비 플롯을 사용하는 것이 좋습니다.

    import matplotlib.pyplot as plt
    import matplotlib.transforms
    import numpy as np
    def plot_spec_line(src, dst, length=0.3, radius=0.1, srctext="v", dsttext="w", 
                       ax=None, color="k", textcolor="k", reccolor="w", lw=1 ):
        if not ax: ax=plt.gca()
        lend=np.sqrt(np.sum(((dst-src)*length)**2))
        s = dst-src
        angle = np.rad2deg(np.arctan2(s[1],s[0]))
        delta = np.array([0,radius])
        tr = matplotlib.transforms.Affine2D().rotate_deg_around(src[0],src[1], angle)
        t = tr + ax.transData
        rec = plt.Rectangle(src-delta, width=lend, height=radius*2, ec=color,facecolor=reccolor, transform=t, linewidth=lw)
        ax.add_patch(rec)
        ax.plot([src[0],dst[0]], [src[1],dst[1]], lw=lw,solid_capstyle="butt", zorder=0, color=color)
        circ1= plt.Circle(src, radius=radius, fill=True, facecolor="w", edgecolor=color, lw=lw)
        circ2= plt.Circle(dst, radius=radius, fill=True, facecolor="w", edgecolor=color, lw=lw)
        ax.add_patch(circ1)
        ax.add_patch(circ2)
        ax.text(src[0],src[1], srctext, fontsize=12, ha="center", va="center", zorder=3, color=textcolor)
        ax.text(dst[0],dst[1], dsttext, fontsize=12, ha="center", va="center", zorder=3, color=textcolor)
    s = np.array([1,1])
    d = np.array([3,2])    
    plot_spec_line(s, d, length=0.3, srctext="v", dsttext="w", radius=0.06,
                   reccolor="plum", )
    s = np.array([1.5,0.9])
    d = np.array([2.8,1.2])    
    plot_spec_line(s, d, length=0.2, srctext="a", dsttext="b", color="gray", lw=2.5)
    s = np.array([1,2])
    d = np.array([2,1.9])    
    plot_spec_line(s, d, length=0.7, srctext="X", dsttext="Y", textcolor="limegreen",
                   reccolor="palegreen", color="limegreen")
    plt.margins(0.2)
    plt.gca().set_aspect("equal")
    plt.show()
    
    

  • 이전 angularjs - Kendo Grid에서 열 너비를 설정하는 방법
  • 다음 레일 4 has_many - 기본 순서를 통해