Как создать 2D-диаграмму рассеяния с группами из трех столбцов массива numpy (gpname, x, y)?

Python 2.7 Нужна ваша помощь в создании 2D-диаграммы рассеяния из трехмерного массива Numpy, где Col0 используется для группового тега, а Col 1 и 2 — для координат (X, Y).

Массив Numpy выглядит следующим образом

array([['A', '4.83186388889', '2.34534666667'],
   ['A', '4.87818611111', '2.80832888889'],
   ['A', '4.82518611111', '2.33834222222'],
   ['B', '4.53763888889', '-11.88424'],
   ['B', '4.503125', '-11.9406266667'],
   ['B', '4.45975555556', '-11.9688044444'],
   ['C', '6.12376666667', '-9.61480888889'],
   ['C', '6.20991666667', '-9.66523111111'],
   ['C', '6.12281388889', '-9.61702222222'],
   ['D', '6.46020833333', '-11.9756488889'],
   ['D', '6.43584166667', '-11.8586622222'],
   ['D', '6.43401111111', '3.88036888889'],
   ....
   dtype='|S21')

Словарь нельзя использовать, так как он хранит уникальные ключи (группы), и я не знаю, как преобразовать его в Pandas DataFrame в правильном формате.

Пробовал, как показано ниже, ранее, и хотя он был напечатан нормально, он не работал для диаграммы.

dataset = pd.DataFrame(**array**, columns = ['Description','X','Y'])
dataset[['X','Y']] = dataset[['X','Y']].apply(pd.to_numeric)

Я хотел бы создать 2D-диаграмму рассеяния для всех тегов моей группы (A, B, C,...) - из нескольких наборов координат (x, y) - отдельный цвет для каждой группы (A, B, C, .. .)

С нетерпением жду вашей помощи.


person wounky    schedule 04.05.2019    source источник
comment
Вы даже искали, как это сделать в первую очередь?   -  person LoneWanderer    schedule 05.05.2019
comment
Искал, не нашел соответствующего примера.   -  person wounky    schedule 05.05.2019
comment
Вы также можете использовать морской язык, который легко решит вашу проблему с цветом. seaborn.pydata.org или python-graph-gallery.com/scatter-plot последний почти полностью соответствует вашему варианту использования, включая объяснения matplotlib   -  person LoneWanderer    schedule 05.05.2019


Ответы (1)


Вам не нужны панды для построения графиков, просто matplotlib. Вы можете выполнить итерацию по массиву и передать каждую координату XY в plt.scatter. Вы даже можете использовать структуру (например, словарь), в которой вы определяете определенный цвет для каждой группы:

import matplotlib.pyplot as plt

colors = {'A': 'red', 
          'B': 'blue',
          'C': 'green',
          'D': 'black'}    
for group, x, y in array:
    plt.scatter(float(x), float(y), color=colors[group])
plt.show()

Изменить: вместо этого используйте это, чтобы динамически создавать случайные цвета для каждой группы, независимо от их количества:

from random import random
import matplotlib.pyplot as plt

colors = {}    
for group, x, y in array:
    plt.scatter(float(x), float(y), color=colors.setdefault(group, (random(), random(), random())))
plt.show()
person jfaccioni    schedule 04.05.2019
comment
Хорошо, думаю также, как включить легенду для групп на графике, не могли бы вы сказать, должно ли это работать автоматически? - person wounky; 05.05.2019
comment
Matplotlib пытается сделать это автоматически. Вы можете добавить аргумент ключевого слова label=group к вызову plt.scatter, а затем один раз вызвать plt.legend() перед вызовом plt.show(). Но проблема здесь в том, что будут созданы повторяющиеся легенды (по одной для каждой отдельной точки разброса). Обратитесь к этому вопросу, чтобы избежать этого. - person jfaccioni; 05.05.2019