#python #pandas #matplotlib #scatter-plot
#python #панды #matplotlib #диаграмма рассеяния
Вопрос:
Начальный шаг — это фрейм данных pandas с несколькими столбцами.
Второй шаг, который я сделал, — это преобразовать некоторые столбцы этого фрейма данных в массив Numpy с помощью to_numpy()
функции.
Я извлекаю что-то вроде:
[[100 200 3.5 1] [100 200 3.5 1] [100 300 6.2 1] [200 125 4.2 1] [100 300 6.2 1] [100 200 3.5 1]]
Где первый элемент, представьте, что это идентификатор источника
, второй элемент — идентификатор судьбы
, 3-й — расстояние между источником судьбы
, а 4-й — просто счетчик (1 элемент) (Я включил его только потому, что считаю, что это может потребоваться для подсчета элементов. Просто игнорируйте его, если предложенное вами решение его не использует)
Я хотел бы иметь диаграмму рассеяния со следующими характеристиками:
- исходный идентификатор по оси x
- destiny_id по оси y
- цвет точки рассеяния в теплой шкале, указывающей расстояние между обеими точками (3-й элемент)
- размер точки разброса зависит от количества имеющихся у нас пар origins_id / destiny_id.например, у нас есть три
комбинации 100 200. Таким образом, его размер должен быть больше, чем у
комбинации 200 125, которая имеет только одну запись.
Я пробовал, но я не могу включить все предварительные условия в этот график. Как этого можно достичь в matplotlib? Или есть какой-либо другой более простой подход, использующий pandas напрямую?
Комментарии:
1. Это две разные задачи. Один из них заключается в обновлении столбца счетчика для пар в panda, другой — в создании графика 4D в matplotlib. Я предлагаю вам сосредоточиться здесь на одном вопросе.
2. Я думаю, что, возможно, это неправильно понято. Цель столбца счетчика — использовать только функцию king of count(), аналогичный подход, который следует классическому алгоритму map-reduce. Я только что включил на случай, если это поможет. Мой главный вопрос связан с сюжетом
3. В этом случае я предлагаю вам изменить свой пример и обновить номера счетчиков, чтобы было ясно, что это не является частью вопроса.
4. Спасибо за отзыв. Я включил комментарий, чтобы прояснить это
Ответ №1:
Если я правильно понял ваши требования, это должно сработать:
import matplotlib.pyplot as plt
import numpy as np
data = np.array([[100,200,3.5,1],[100,200,3.5,1],[100,300,6.2,1],[200,125,4.2,1],[100,300,6.2,1],[100,200,3.5,1]])
unique, counts = np.unique(data, axis=0, return_counts=True)
x = unique[:,0]
y = unique[:,1]
c = unique[:,2]
## figure out a nice looking scaling factor here
# and remember that the scatter point size is supposed to be an area,
# hence squaring a base factor is ideal
s = (counts*10)**2
fig, ax = plt.subplots()
sca = ax.scatter(x,y,c=c,s=s)
plt.colorbar(sca)
plt.show()
что дает: