【问题标题】:Drawing a 3d scatter plot with data dependent markers and colors使用数据相关的标记和颜色绘制 3d 散点图
【发布时间】:2020-02-04 03:25:23
【问题描述】:

我有一个数据框df 有 5 列 f1,f2,f3,f4,y,其中所有列中的所有值都来自有限的整数集,实际上,所有列都是分类列,转换为整数.我想做的是画一个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 列表的开头。

我不确定如何执行这个想法,或者是否有更好的选择。

【问题讨论】:

    标签: python matplotlib seaborn


    【解决方案1】:

    您可以遍历 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()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-06
      • 1970-01-01
      • 2021-04-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多