Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/293.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python中带有色调颜色贴图和图例的3D散点图_Python_Matplotlib_Seaborn - Fatal编程技术网

Python中带有色调颜色贴图和图例的3D散点图

Python中带有色调颜色贴图和图例的3D散点图,python,matplotlib,seaborn,Python,Matplotlib,Seaborn,我一直在用seaborn用python搜索3D绘图,但没有看到任何。我想3D打印我最初使用seaborn pairplot绘制的数据集。有人能帮我解决以下两个问题吗: 我无法获得与sns pairplot相同的调色板,例如,如何从图2获得调色板并应用于图1上的点 图例不粘在绘图上或在pairplot上显示不好,例如,当我执行plt.legend时(bbox_to_anchor=(1.05,1),loc=2,borderaxespad=0,ncol=4)我看到以下错误:anaconda2/lib/

我一直在用seaborn用python搜索3D绘图,但没有看到任何。我想3D打印我最初使用seaborn pairplot绘制的数据集。有人能帮我解决以下两个问题吗:

  • 我无法获得与sns pairplot相同的调色板,例如,如何从图2获得调色板并应用于图1上的点
  • 图例不粘在绘图上或在pairplot上显示不好,例如,当我执行
    plt.legend时(bbox_to_anchor=(1.05,1),loc=2,borderaxespad=0,ncol=4)
    我看到以下错误:anaconda2/lib/python2.7/site packages/matplotlib/axes/\u axes.py:545:UserWarning:找不到带标签的对象。在单个绘图上使用label='…'kwarg。warnings.warn(“未找到带标签的对象。”
  • 提前谢谢! 我的推荐人:

    这里有一个MWE:

    import re, seaborn as sns, numpy as np, pandas as pd, random
    from pylab import *
    from matplotlib.pyplot import plot, show, draw, figure, cm
    import matplotlib.pyplot as plt
    from mpl_toolkits.mplot3d import Axes3D
    sns.set_style("whitegrid", {'axes.grid' : False})
    
    fig = plt.figure(figsize=(6,6))
    
    ax = Axes3D(fig) # Method 1
    # ax = fig.add_subplot(111, projection='3d') # Method 2
    
    x = np.random.uniform(1,20,size=20)
    y = np.random.uniform(1,100,size=20)
    z = np.random.uniform(1,100,size=20)
    
    
    ax.scatter(x, y, z, c=x, marker='o')
    ax.set_xlabel('X Label')
    ax.set_ylabel('Y Label')
    ax.set_zlabel('Z Label')
    
    plt.show()
    


    图2没有调色板规范,但它看起来像是matplotlib()中的成对定性颜色映射。因此,您需要在3D绘图的代码中使用
    cmap
    参数和pairplot中的
    调色板
    选项来指定

    图例更难。你可以用图例元素制作一个。更好解释

    因此,您的代码如下所示(我去掉了未使用的导入):

  • Seaborn调色板可以从使用
    as_hex()
    方法初始化的
    ListedColorMap
    类的实例转换为Matplotlib颜色映射(如中所建议)

  • 从中,可以从散点图生成图例,并获取
    散点
    函数输出的句柄和标签

  • 代码的结果如下图所示。请注意,我生成了更多的数据点,以便更好地查看颜色贴图是否相同。此外,
    ListedColorMap
    的输出输出了具有透明度变化的颜色贴图,因此我必须在散点图中将
    alpha
    手动设置为1

    导入re,seaborn作为sns
    将numpy作为np导入
    从matplotlib导入pyplot作为plt
    从mpl_toolkits.mplot3d导入Axes3D
    从matplotlib.colors导入ListedColormap
    #生成数据
    n=200
    x=np.随机.均匀(1,20,尺寸=n)
    y=np.随机.均匀(1100,尺寸=n)
    z=np.随机.均匀(1100,尺寸=n)
    #轴实例
    图=plt.图(图尺寸=(6,6))
    ax=Axes3D(图,自动添加到图=假)
    图添加_轴(ax)
    #从seaborn获取彩色地图
    cmap=ListedColormap(sns.color\u调色板(“husl”,256).as\u hex())
    #密谋
    sc=最大散射(x,y,z,s=40,c=x,marker='o',cmap=cmap,alpha=1)
    ax.set_xlabel('X标签')
    ax.set_ylabel('Y Label'))
    ax.set_zlabel('Z标签')
    #传奇
    plt.legend(*sc.legend_elements(),bbox_to_anchor=(1.05,1),loc=2)
    #拯救
    plt.savefig(“散射色调”,bbox\u英寸=紧密”)
    

    #Seaborn pair plot
    df_3d = pd.DataFrame()
    df_3d['x'] = x
    df_3d['y'] = y
    df_3d['z'] = z
    
    sns.pairplot(df_3d, hue='x')
    
    import seaborn as sns, numpy as np, pandas as pd, random
    import matplotlib.pyplot as plt
    from mpl_toolkits.mplot3d import Axes3D
    sns.set_style("whitegrid", {'axes.grid' : False})
    
    fig = plt.figure(figsize=(6,6))
    
    ax = Axes3D(fig)
    
    x = np.random.uniform(1,20,size=20)
    y = np.random.uniform(1,100,size=20)
    z = np.random.uniform(1,100,size=20)
    
    
    g = ax.scatter(x, y, z, c=x, marker='o', depthshade=False, cmap='Paired')
    ax.set_xlabel('X Label')
    ax.set_ylabel('Y Label')
    ax.set_zlabel('Z Label')
    
    # produce a legend with the unique colors from the scatter
    legend = ax.legend(*g.legend_elements(), loc="lower center", title="X Values", borderaxespad=-10, ncol=4)
    ax.add_artist(legend)
    
    plt.show()