Scatterplot с различным размером, маркером и цветом из фрейма данных pandas
Я пытаюсь сделать диаграмму рассеяния со скоростью над метрами для каждой точки, где маркер указывает разные типы, размер указывает разные веса и цвет указывают, сколько лет точка более 10 минут масштаба. Однако пока мне удавалось строить только по размеру.
любая помощь будет высоко ценится.
x = {'speed': [10, 15, 20, 18, 19], 'meters' : [122, 150, 190, 230, 300], 'type': ['phone', 'phone', 'gps', 'gps', 'car'], 'weight': [0.2, 0.3, 0.1, 0.85, 0.0], 'old': [1, 2, 4, 5, 8]}
m = pd.DataFrame(x)
plt.scatter(m.meters, m.speed, s = 30* m.weight)
mkr_dict = {'gps': 'x', 'phone': '+', 'car': 'o'}
meters speed type weight old
0 122 10 phone 0.20 1
1 150 15 phone 0.30 2
2 190 20 gps 0.10 4
3 230 18 gps 0.85 5
4 300 19 car 0.00 8
обновленный вопрос:
Я пытаюсь добавить colorbar в цветовую шкалу на основе старого. это сработало, когда я построил график против всего набора данных, но не удалось после попытки добавить маркер для каждого подмножества. Есть идеи?
plt.scatter(m.meters, m.speed, s = 30* m.weight, c=m.old)
cbar = plt.colorbar(ticks = [0, 5, 10])
cbar.ax.set_yticklabels(['New','5mins', '10mins'])
TypeError: вы должны сначала set_array для mappable
2 ответов
scatter
может делать только один вид маркера за раз, поэтому вам нужно построить разные типы отдельно. К счастью, панды делает это легко:
import matplotlib.pyplot as plt
import pandas as pd
x = {'speed': [10, 15, 20, 18, 19],
'meters' : [122, 150, 190, 230, 300],
'type': ['phone', 'phone', 'gps', 'gps', 'car'],
'weight': [0.2, 0.3, 0.1, 0.85, 0.0],
'old': [1, 2, 4, 5, 8]}
m = pd.DataFrame(x)
mkr_dict = {'gps': 'x', 'phone': '+', 'car': 'o'}
for kind in mkr_dict:
d = m[m.type==kind]
plt.scatter(d.meters, d.speed,
s = 100* d.weight,
c = d.old,
marker = mkr_dict[kind])
plt.show()
.... Где машина? Ну, вес 0.0 в исходных тестовых данных, и мы используем вес для размера маркера, поэтому: не вижу его.