Неправильный результат при попытке построить график паутины в matplotlib

#python #numpy #matplotlib #plot #graph

Вопрос:

Я практикуюсь в использовании библиотеки matplotlib и pyplot, и именно по этой причине я пытаюсь создать функцию, которая строит точки так, чтобы любые две точки имели линию, соединяющую их.

Я думаю, что я близок к решению проблемы, но результат все еще кажется немного странным.

Мой код таков:

 import numpy as np
import matplotlib.pyplot as plt

alpha = (np.sqrt(2)/2)
square_points = ((0, 0),(1, 0),(0, 1),(1, 1))
shape_points = ((1, 0),(alpha, alpha),(0, 1),(-alpha, alpha),(-1, 0),(-alpha, -alpha),(0, -1),(alpha, -alpha))


def complete_graph(points):
    for i in range(len(points)):
        for j in range(i):
            x = (points[i])
            y = (points[j])
            plt.plot(x, y)
    plt.show()

complete_graph(square_points)   #square shape
complete_graph(shape_points)    #spider web ish shape
 

Результат должен выглядеть так:
Квадратная форма

введите описание изображения здесь

Форма паутины

введите описание изображения здесь

Однако мой результат таков:

Для того, что должно быть квадратной формы:
введите описание изображения здесь

введите описание изображения здесь

Для того, что должно быть формой паутины
введите описание изображения здесь

Комментарии:

1. @JohanC: Это решило проблему! Большое спасибо!

2. @JohanC, я считаю, что вы должны написать ответ.

3. @JohanC: Если вы напишете ответ, я приму его как решение. Самое меньшее, что я могу сделать, это вознаградить вас несколькими очками за великолепную помощь, которую вы оказали:-)

Ответ №1:

Вам нужно иметь координаты x и y отдельно. Самым простым было бы x=[points[i][0], points[j][0]] и y=[points[i][1], points[j][1]] .

Используя numpy, код может быть написан для создания всех x. Вершины можно нарисовать с помощью plt.scatter() . Установка z-порядка на 3 показывает их перед краями.

 import numpy as np
import matplotlib.pyplot as plt

alpha = np.sqrt(2) / 2
square_points = ((0, 0), (1, 0), (0, 1), (1, 1))
shape_points = ((1, 0), (alpha, alpha), (0, 1), (-alpha, alpha), (-1, 0), (-alpha, -alpha), (0, -1), (alpha, -alpha))

def complete_graph(points):
    # calculate and plot the edges
    edges = np.array([(points[i], points[j]) for i in range(len(points)) for j in range(i)]).reshape(-1, 2)
    plt.plot(edges[:, 0], edges[:, 1], color='dodgerblue')
    points = np.array(points)
    # plot the vertices
    plt.scatter(points[:, 0], points[:, 1], color='mediumvioletred', s=100, zorder=3)
    plt.axis('equal')  # show squares as squares (x and y with the same distances)
    plt.axis('off')  # hide the surrounding rectangle and ticks
    plt.show()

complete_graph(square_points)  # square shape
complete_graph(shape_points)  # spider web ish shape
 

два полных графика

Комментарии:

1. Спасибо! Это прекрасно решило проблему! Хотя есть еще один вопрос. На изображении, которое я разместил в описании, внешние точки окрашены в розовый цвет. Вы знаете, как это тоже было сделано? Это похоже на вашего бога с matplotlib, мягко говоря:-)