我有一个包含5列f1,f2,f3,f4,y的数据帧df
,其中所有列中的所有值均来自有限的整数集,实际上,所有列都是分类列,已转换到整数。我想做的是绘制一个3d散点图,在轴上使用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列获得标记样式。受这个post的启发,我可能会定义一个可能的标记列表:
marker_styles = ['.','o','v','^','>','<','s','p','*','h','H','D','d','1']
然后,我将基于f4将数据分组。对于每个组,我将使用下一个标记,如果组多于标记,则旋转回到marker_styles列表的开头。
我不确定如何执行此想法,或者不确定是否有更好的选择。
答案 0 :(得分:2)
您可以遍历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()