Построение трехмерного точечного графика с зависимыми от данных маркерами и цветами - PullRequest
0 голосов
/ 04 февраля 2020

У меня есть фрейм данных df с 5 столбцами, f1, f2, f3, f4, y, где все значения во всех столбцах взяты из конечного набора целых чисел, фактически все столбцы являются категориальными столбцами, преобразованными в целые числа , Я хотел бы нарисовать трехмерную диаграмму рассеяния с f1, f2, f3 на оси, стиль маркера должен быть определен с помощью f4, и, наконец, цвет должен быть определен по столбцу y.

Следующий код имеет дело с осью и цветами.

import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
fig =plt.figure(figsize=(20,16)).gca(projection='3d')
fig.scatter(df['f1'], df['f2'], df['f3'], c=df['y'], s=100)
plt.show()

Однако я не уверен, как получить стиль маркера на основе столбца f4. Удаленно вдохновленный этим сообщением Я, вероятно, определил бы список возможных маркеров:

marker_styles = ['.','o','v','^','>','<','s','p','*','h','H','D','d','1']

Затем я бы сгруппировал свои данные на основе f4. Для каждой группы я бы использовал следующий маркер и повернул назад к началу списка marker_styles, если есть больше групп, чем маркеров.

Я не уверен, как реализовать эту идею, или есть ли лучшие альтернативы.

1 Ответ

2 голосов
/ 04 февраля 2020

Вы можете перебрать все возможные значения для f4, создать фильтр для этого значения и объединить его с маркером:

from matplotlib import pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
import numpy as np
import pandas as pd
import itertools

N = 100
print(np.random.randint(1, 10, N))
df = pd.DataFrame({'f1': np.random.randint(1, 11, N),
                   'f2': np.random.randint(1, 11, N),
                   'f3': np.random.randint(1, 11, N),
                   'f4': np.random.randint(1, 11, N),
                   'y': np.random.randint(1, 11, N)})
marker_styles = ['.', 'o', 'v', '^', '>', '<', 's', 'p', '*', 'h', 'H', 'D', 'd', '1']

fig = plt.figure(figsize=(20, 16)).gca(projection='3d')
f4min = df['f4'].min()
f4max = df['f4'].max()
for f, m in zip(range(f4min, f4max + 1), itertools.cycle(marker_styles)):
    filter = df['f4'] == f
    fig.scatter(df['f1'][filter], df['f2'][filter], df['f3'][filter], c=df['y'][filter], s=100, marker=m, cmap='plasma')
plt.show()

example

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