Построение PANDAS DF на 3D-графике с изменением ширины - PullRequest
0 голосов
/ 29 июня 2018

У меня есть датафрейм PANDAS со следующими данными:

DF0 = pd.DataFrame(np.random.uniform(0,100,(4,2)), columns=['x', 'y'])  
pupil_rads = pd.Series(np.random.randint(1,10,(4)))  
DF0["pupil_radius"] = pupil_rads  
DF0

[out:]
    x           y           pupil_radius
0   20.516882   15.098594   8
1   92.111798   97.200075   2
2   98.648040   94.133676   3
3   8.524813    88.978467   7  

Я хочу создать трехмерный график, показывающий, куда направлен взгляд (координаты x / y) в каждом измерении (индекс DF). Также я пытаюсь сделать это линейным графиком, чтобы радиус линии соответствовал радиусу зрачка.
Пока что я придумал следующее:

gph = plt.figure(figsize=(15,8)).gca(projection='3d')
gph.scatter(DF0.index, DF0['x'], DF0['y'])
gph.set_xlabel('Time Stamp')
gph.set_ylabel('X_Gaze')
gph.set_zlabel('Y_Gaze')

Это создает трехмерный график рассеяния, который почти , что мне нужно:

  1. Как сделать точки данных разного размера?
  2. Есть ли способ создать непрерывный линейный график, а не точечный график?

1 Ответ

0 голосов
/ 29 июня 2018

Второй вопрос был бы прост, потому что вы можете использовать plot вместо scatter. plot имеет параметр markersize, что хорошо, но на самом деле этот параметр не принимает ряд, что плохо. Но мы можем эмулировать его поведение, рисуя линейный график и маркеры отдельно:

import numpy as np
from matplotlib import pyplot as plt
import pandas as pd
from mpl_toolkits.mplot3d import Axes3D
#reproducibility of random results
np.random.seed(0)

DF0 = pd.DataFrame(np.random.uniform(0,100,(4,2)), columns=['x', 'y'])  
pupil_rads = pd.Series(np.random.randint(1,10,(4)))  
#pupil^2 otherwise we won't see much of a difference in markersize
DF0["pupil_radius"] = np.square(pupil_rads)  

gph = plt.figure(figsize=(15,8)).gca(projection='3d')
#plotting red dotted lines with tiny markers
gph.plot(DF0.index, DF0.x, DF0.y, "r.--")
#and on top of it goes a scatter plot with different markersizes
gph.scatter(DF0.index, DF0.x, DF0.y, color = "r", s = DF0.pupil_radius, alpha = 1)
gph.set_xlabel('Time Stamp')
gph.set_ylabel('X_Gaze')
gph.set_zlabel('Y_Gaze')

plt.show()

Пример вывода:

enter image description here

Дополнительная информация о размерах и размерах маркеров на графике и разбросе

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