matplotlib 3D散点图与色调颜色图和图例

cpjpxq1n  于 2023-05-01  发布在  其他
关注(0)|答案(2)|浏览(166)

我一直在用seaborn在python中搜索3D图,但没有看到任何。我想3D绘制一个最初使用seaborn.pairplot绘制的数据集。有没有人可以帮我解决这两个问题:
1.我不能得到相同的调色板作为sns对图,e。例如,如何从图2中获得调色板并应用于图1上的点?
1.图例不坚持情节或不显示作为尼斯对图,e。g.当我执行plt.legend(bbox_to_anchor=(1.05, 1), loc=2, borderaxespad=0.,ncol=4)时,我看到以下错误:anaconda2/lib/python2.7/site-packages/matplotlib/axes/_axes。py:545:用户警告:未找到带标签的对象。使用label ='。...“kwargs在个别地块。warns.warn(“没有找到标记的对象。“
我的推荐人:How to make a 3D scatter plot in matplotlibhttps://pythonspot.com/3d-scatterplot/https://jakevdp.github.io/PythonDataScienceHandbook/04.12-three-dimensional-plotting.html

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()

#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')

inn6fuwd

inn6fuwd1#

  1. Seaborn中的调色板可以通过as_hex()方法(如this original answer中所建议的)从一个ListedColorMap类的示例转换为Matplotlib颜色Map,该示例使用Seaborn调色板中的颜色列表进行初始化。
    1.从Matplotlib文档中,您可以通过获取scatter函数输出的句柄和标签,从散点图生成图例。
    代码的结果如下图所示。请注意,我生成了更多的数据点,以便更好地看到色图是相同的。此外,ListedColorMap的输出输出的颜色图具有透明度变化,所以我不得不手动将alpha设置为1。
import re, seaborn as sns
import numpy as np

from matplotlib import pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
from matplotlib.colors import ListedColormap

# generate data
n = 200
x = np.random.uniform(1, 20, size=n)
y = np.random.uniform(1, 100, size=n)
z = np.random.uniform(1, 100, size=n)

# axes instance
fig = plt.figure(figsize=(6,6))
ax = Axes3D(fig, auto_add_to_figure=False)
fig.add_axes(ax)

# get colormap from seaborn
cmap = ListedColormap(sns.color_palette("husl", 256).as_hex())

# plot
sc = ax.scatter(x, y, z, s=40, c=x, marker='o', cmap=cmap, alpha=1)
ax.set_xlabel('X Label')
ax.set_ylabel('Y Label')
ax.set_zlabel('Z Label')

# legend
plt.legend(*sc.legend_elements(), bbox_to_anchor=(1.05, 1), loc=2)

# save
plt.savefig("scatter_hue", bbox_inches='tight')

mzaanser

mzaanser2#

图2没有调色板规范,但它看起来像是matplotlib(from here)中的Paired定性色彩图。因此,您需要在3D图的代码中使用cmap参数和pairplot中的palette选项来指定。
传奇更难。您可以从legend_elements创建一个。最好在这里解释一下。
所以你的代码看起来像这样(我去掉了未使用的导入):

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()

相关问题