Графические пространства Matplotlib, разделенные массивом данных

Каков самый простой способ отформатировать данные этого массива, чтобы я мог соединить точки на итерации графика, предполагая, что каждая строка содержит координаты x и y одной точки?

import matplotlib.pyplot as plt
(...)

<class 'numpy.ndarray'>
[-22.58343371   7.97162262]
[-49.08400669 -28.64111278]
[-71.47754547 -25.78248676]
[-46.27120899 -21.72541444]
[ 43.6158669  109.61815799]
[-22.58343371   7.97162262]

(...)

plt.plot(x, y, color='orange')

Извините, ниже приведен почти полный код (порядок вычисляется по другому алгоритму), исправленный благодаря комментарию Куанг Хоанга. Очевидно, это часть решения известной проблемы TSP. Суть, конечно, в том, чтобы соединить точки в правильном порядке в списке, в данном случае это: (0, 2, 1, 3, 4, 0).

from sklearn.decomposition import PCA
import matplotlib.pyplot as plt
import numpy as np

n = 5
order = (0, 2, 1, 3, 4, 0)

distances = [[0, 39, 22, 59, 54, 33, 57, 32, 89, 73, 29, 46],
             [39, 0, 20, 20, 81, 8, 49, 64, 63, 84, 10, 61],
             [22, 20, 0, 39, 74, 18, 60, 44, 71, 73, 11, 46],
             [59, 20, 39, 0, 93, 27, 51, 81, 48, 80, 30, 69],
             [54, 81, 74, 93, 0, 73, 43, 56, 104, 76, 76, 77],
             [33, 8, 18, 27, 73, 0, 45, 61, 71, 88, 8, 63],
             [57, 49, 60, 51, 43, 45, 0, 85, 88, 115, 52, 103],
             [32, 64, 44, 81, 56, 61, 85, 0, 74, 43, 55, 23],
             [89, 63, 71, 48, 104, 71, 88, 74, 0, 38, 69, 51],
             [73, 84, 73, 80, 76, 88, 115, 43, 38, 0, 81, 28],
             [29, 10, 11, 30, 76, 8, 52, 55, 69, 81, 0, 55],
             [46, 61, 46, 69, 77, 63, 103, 23, 51, 28, 55, 0]]

pca = PCA(n_components=2)
coord = pca.fit_transform(distances[:n])

plt.scatter(coord[:,0], coord[:,1])

for i in coord:
    x = np.where(coord == i)
    plt.annotate((x[0][0]) ,i, color='red')

for j in order:
    print(coord[j])
    plt.plot(coord[:,0], coord[:,1], color='orange')
plt.show()

Пожалуйста, опубликуйте полный код. Кроме того, что вы подразумеваете под «соединением точек на итерации графика»?

Kapocsi 17.12.2020 18:25
plt.plot(arr[:,0], arr[:,1])?
Quang Hoang 17.12.2020 18:26
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
2
304
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Вероятно, вам нужно отсортировать данные, чтобы получить желаемую визуализацию:

import numpy as np
import matplotlib.pyplot as plt


a = np.array([[-22.58343371,   7.97162262],
              [-49.08400669, -28.64111278],
              [-71.47754547, -25.78248676],
              [-46.27120899, -21.72541444],
              [ 43.6158669 , 109.61815799],
              [-22.58343371,   7.97162262]])


order = a[:, 0].argsort()
plt.plot(a[order, 0], a[order, 1], color='orange', marker='o', linestyle='-')
plt.show()

Если вы не сортируете его, вы получите что-то вроде этого:

import numpy as np
import matplotlib.pyplot as plt


a = np.array([[-22.58343371,   7.97162262],
              [-49.08400669, -28.64111278],
              [-71.47754547, -25.78248676],
              [-46.27120899, -21.72541444],
              [ 43.6158669 , 109.61815799],
              [-22.58343371,   7.97162262]])

plt.plot(a[:, 0], a[:, 1], color='orange', marker='o', linestyle='-')
plt.show()

Спасибо, Капочи, но я хотел бы построить линии в заданном порядке.

uhlik 18.12.2020 12:21

Иногда, по прошествии многих часов, кажется, что все сложнее, чем есть на самом деле :) Большое спасибо, Капочи! Рабочее решение ниже:

from sklearn.decomposition import PCA
import matplotlib.pyplot as plt
import numpy as np

n = 5
order = [0, 2, 1, 3, 4, 0]

distances = [[0, 39, 22, 59, 54, 33, 57, 32, 89, 73, 29, 46],
             [39, 0, 20, 20, 81, 8, 49, 64, 63, 84, 10, 61],
             [22, 20, 0, 39, 74, 18, 60, 44, 71, 73, 11, 46],
             [59, 20, 39, 0, 93, 27, 51, 81, 48, 80, 30, 69],
             [54, 81, 74, 93, 0, 73, 43, 56, 104, 76, 76, 77],
             [33, 8, 18, 27, 73, 0, 45, 61, 71, 88, 8, 63]]

pca = PCA(n_components=2)
coord = pca.fit_transform(distances[:n])

plt.scatter(coord[:,0], coord[:,1])

for i in coord:
    x = np.where(coord == i)
    plt.annotate((x[0][0]) ,i, color='red')

x = coord[order]
print(x)

plt.plot(x[:, 0], x[:, 1], color='orange', marker='o', linestyle='-')
plt.show()

Другие вопросы по теме