3D-диаграмма рассеяния: многозначная диаграмма, раскраска по столбцу
Я хочу выполнить трехмерную диаграмму рассеяния с фреймом данных, который имеет следующий формат:
df = pd.DataFrame({"Date": ['2021-01-01', '2021-01-02', '2021-01-03', '2021-01-04'],
"A_x1": [1, 2, 2, 2],
"A_x2": [9, 2, 2, 3],
"A_x3": [1, 3, 2, 9],
"B_x1": [1, 8, 2, 3],
"B_x2": [3, 8, 9, 3],
"B_x3": [2, 4, 5, 5],
"C_x1": [2, 6, 5, 2],
"C_x2": [4, 8, 1, 3],
"C_x3": [6, 9, 5, 7]})
Как вы могли догадаться: 3 оси трехмерной диаграммы рассеяния должны быть x1, x2 и x3. Итак, у меня есть 3 переменных для 3-х осей, но несколько значений для каждой строки. Я хочу построить значения A_x1 / 2/3, B_x1 / 2/3 и т. Д. В соответствующей точке и раскрасить их (например, A = красный, B = зеленый, C = синий и т. Д.).
Я пытался использовать matplotlib и plotly, но я открыт для любых других библиотек. Чтобы получить фрейм данных или массив для всех значений x_1, я использую следующий код.
df_x_1 = df.filter(like='1') #df x_1
x_1 = df_x_1.to_numpy() #arr_x_1
Это простейшая диаграмма рассеяния в plotly, отлично работает:
import plotly.express as px
fig = px.scatter_3d(df,
x='A_x1',
y='A_x2',
z='A_x3',
#color='species'
)
fig.show()
Часть проблемы, которую решил @Ynjxsjmh, испортила:
Но это обв. отображает значения x1, x2, x3 для A (= 3 столбца), я хочу, чтобы все столбцы>! были включены. Я хочу сделать что-то подобное, но получаю разные ошибки. Пробовал с>! Dataframe и массивами. код
fig = px.scatter_3d(x=df.filter(like='1').values.ravel('F'),
y=df.filter(like='2').values.ravel('F'),
z=df.filter(like='3').values.ravel('F'),
color = ( df.filter(like='3').values.ravel('F')*df.filter(like='2').values.ravel('F')*df.filter(like='1').values.ravel('F') )**(1/3)
)
fig.show()
Этот код работает сейчас. Точки данных (например, A_x1,x2,x3 присутствуют в точках исправления). Какое покрытие пока непонятно: Окраска.
Теперь я раскрашиваю точки данных в соответствии с их геометрическим размером, выполняя color = (x_1 x_2 x_3) ^ (1/3)
Что я хочу: раскрасьте точки данных в соответствии с именем столбца или первой строкой фрейма данных или чем-то еще (мне придется добавить эту строку, но это не будет проблемой).
Любые идеи? Спасибо!
1 ответ
x
,
y
а также
z
из plotly.express.scatter_3d() должно быть Облы или INT или серия или массив типа .
df.filter(like='1')
возвращает фрейм данных.
Вы можете использовать numpy.ravel () для сглаживания значений в направлении столбца.
fig = px.scatter_3d(x=df.filter(like='1').values.ravel('F'),
y=df.filter(like='2').values.ravel('F'),
z=df.filter(like='3').values.ravel('F'),
)