[英]Drawing a 3d scatter plot with data dependent markers and colors
我有一個包含 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 列獲取標記樣式。 受到這篇文章的遠程啟發,我可能會定義一個可能的標記列表:
marker_styles = ['.','o','v','^','>','<','s','p','*','h','H','D','d','1']
然后我會根據 f4 對我的數據進行分組。 對於每個組,我將使用下一個標記,如果組多於標記,則旋轉回 marker_styles 列表的開頭。
我不確定如何執行這個想法,或者是否有更好的選擇。
您可以遍歷 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()
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.