>

예를 들어, 해당 색상으로 다음과 같은 좌표가 육각형 육각형 격자를 나타냅니다.

coord = [[0,0,0],[0,1,-1],[-1,1,0],[-1,0,1],[0,-1,1],[1,-1,0],[1,0,-1]]
colors = [["Green"],["Blue"],["Green"],["Green"],["Red"],["Green"],["Green"]]

Plot에서 점이 육각형 모양을 유지하도록 파이썬에서 어떻게 이것을 그릴 수 있습니까? 또한 육각형의 '색상'목록을 나타내는 방법은 무엇입니까?

일부 :

간단한 육각형 격자

그러나 모양은 중요하지 않습니다. 단순한 산점도 유형 시각화만으로 충분합니다. 다른 육각형과 관련하여 색상이 어디에 있는지 알 수 있습니다.

  • 답변 # 1

    당신은 단지 (y, z) 를 돌리기 만하면됩니다  육각형에서 y 로 좌표  matplotlib 축의 직교 좌표입니다.

    올바른 방법은이 공식을 사용하는 것입니다 :

    y_cartesian = (2 / 3) * sin(60) * (y_hex - z_hex)
    
    

    그런 다음 matplotlib RegularPolygon 를 사용하여 육각형을 추가 할 수 있습니다   scatter 를 사용하여 중심을 패치하거나 플롯하십시오. .

    다음은 목록에서 플롯을 작성하는 스크립트입니다.

    import matplotlib.pyplot as plt
    from matplotlib.patches import RegularPolygon
    import numpy as np
    coord = [[0,0,0],[0,1,-1],[-1,1,0],[-1,0,1],[0,-1,1],[1,-1,0],[1,0,-1]]
    colors = [["Green"],["Blue"],["Green"],["Green"],["Red"],["Green"],["Green"]]
    labels = [['yes'],['no'],['yes'],['no'],['yes'],['no'],['no']]
    # Horizontal cartesian coords
    hcoord = [c[0] for c in coord]
    # Vertical cartersian coords
    vcoord = [2. * np.sin(np.radians(60)) * (c[1] - c[2]) /3. for c in coord]
    fig, ax = plt.subplots(1)
    ax.set_aspect('equal')
    # Add some coloured hexagons
    for x, y, c, l in zip(hcoord, vcoord, colors, labels):
        color = c[0].lower()  # matplotlib understands lower case words for colours
        hex = RegularPolygon((x, y), numVertices=6, radius=2. / 3., 
                             orientation=np.radians(30), 
                             facecolor=color, alpha=0.2, edgecolor='k')
        ax.add_patch(hex)
        # Also add a text label
        ax.text(x, y+0.2, l[0], ha='center', va='center', size=20)
    # Also add scatter points in hexagon centres
    ax.scatter(hcoord, vcoord, c=[c[0].lower() for c in colors], alpha=0.5)
    plt.show()
    
    

  • 답변 # 2

    (u, v, w) 16 진 좌표의 튜플을 직사각형 좌표로. 표준 turtle 를 사용하여 설명하겠습니다.  모듈 (matplotlib 모듈이 없습니다). 각 점이 올바른 위치에 그려져 있는지 쉽게 확인할 수 있도록 목록에서 색상을 변경했습니다.

    import turtle
    from math import sqrt
    root3 = sqrt(3)
    # the scale used for drawing
    side = 50
    # Convert hex coordinates to rectangular
    def hex_to_rect(coord):
        u, v, w = coord
        x = u - v/2 - w/2
        y = (v - w) * root3 / 2
        return x * side, y * side
    # Initialize the turtle
    t = turtle.Turtle()
    t.speed(0)
    t.hideturtle()
    t.up()
    coords = [[0,0,0], [0,1,-1], [-1,1,0], [-1,0,1], [0,-1,1], [1,-1,0], [1,0,-1]]
    colors = ['black', 'red', 'orange', 'green', 'cyan', 'blue', 'magenta']
    #Plot the points
    for hexcoord, color in zip(coords, colors):
        xy = hex_to_rect(hexcoord)
        t.goto(xy)
        t.dot(15, color)
    # Wait for the user to close the window
    turtle.done()
    
    

    출력

  • 답변 # 3

    아래는 PM2Ring의 거북이를 끝내려는 시도입니다 기반 솔루션 (+1)과 그의 대답에서 좌표 계산 오류로 보이는 것을 수정하십시오.

    from math import sqrt
    from turtle import Turtle, Screen
    ROOT3_OVER_2 = sqrt(3) / 2
    FONT_SIZE = 18
    FONT = ('Arial', FONT_SIZE, 'normal')
    SIDE = 50  # the scale used for drawing
    # Convert hex coordinates to rectangular
    def hex_to_rect(coord):
        v, u, w = coord
        x = -u / 2 + v - w / 2
        y = (u - w) * ROOT3_OVER_2
        return x * SIDE, y * SIDE
    def hexagon(turtle, radius, color, label):
        clone = turtle.clone()  # so we don't affect turtle's state
        xpos, ypos = clone.position()
        clone.setposition(xpos - radius / 2, ypos - ROOT3_OVER_2 * radius)
        clone.setheading(-30)
        clone.color('black', color)
        clone.pendown()
        clone.begin_fill()
        clone.circle(radius, steps=6)
        clone.end_fill()
        clone.penup()
        clone.setposition(xpos, ypos - FONT_SIZE / 2)
        clone.write(label, align="center", font=FONT)
    # Initialize the turtle
    tortoise = Turtle(visible=False)
    tortoise.speed('fastest')
    tortoise.penup()
    coords = [[0, 0, 0], [0, 1, -1], [-1, 1, 0], [-1, 0, 1], [0, -1, 1], [1, -1, 0], [1, 0, -1]]
    colors = ["Green", "Blue", "Green", "Green", "Red", "Green", "Green"]
    labels = ['yes', 'no', 'yes', 'no', 'yes', 'no', 'no']
    # Plot the points
    for hexcoord, color, label in zip(coords, colors, labels):
        tortoise.goto(hex_to_rect(hexcoord))
        hexagon(tortoise, SIDE, color, label)
    # Wait for the user to close the window
    screen = Screen()
    screen.exitonclick()
    
    

  • 이전 android - 두 개의 TextView를 차례로 정렬 (첫 ​​번째 텍스트 뷰가 매우 길어짐)
  • 다음 python - 객체 유형을 확인하고 목록으로 변환