如何使用 matplotlib 为 3D 散点图创建标记尺寸图例?
How can I create a markersize legend for a 3D scatter plot with matplotlib?
我创建了一个同时使用颜色和标记大小以及独立维度的 3D 散点图。我添加了颜色条图例,但无法弄清楚如何为标记大小创建图例。
目前剧情是这样的:
理想情况下,我想创建一个具有 6 个标记的图例,这些标记的大小在 0 到 250 之间逐渐增加。
例如:
Size | Label
0 | 'Small'
50 | 'Less Small'
100 | 'Getting There'
150 | 'Above Average'
200 | 'Pretty Big'
250 | 'Large'
这是生成情节的代码。输入变量 xp、yp、zp、cp 和 co 是我在别处生成的列表。
mat.style.use(['ggplot'])
fig = plt.figure(figsize=(20,15));
norm = mat.colors.Normalize(vmin=min(co), vmax=max(co))
mapper = cm.ScalarMappable(norm=norm, cmap=cm.RdBu)
cc = list()
for v in co:
cc.append(mapper.to_rgba(v))
ax = fig.add_subplot(111, projection='3d');
ax.scatter(xp, yp, zp, s=cp, c=cc, depthshade=True, linewidth=1, edgecolor='black');
mapper.set_array(cc)
plt.colorbar( mapper, label='Count' )
y = lambda x: (np.tanh(-x*50.)+1.)*250
x = np.arange(0,.05,.01)
sizes = y(x)
labels = x
# I can't figure out what to do here:
l = ax.legend(sizes, scatterpoints = len(sizes))
我发现执行此操作的最佳方法是添加一些用于构建图例的虚拟数据。
sizes = np.arange(0, 300, 50)
labels = ['size={0}'.format(s) for s in sizes]
points = [ax.scatter([], [], [], s=s, c='gray') for s in sizes]
plt.legend(points, labels, scatterpoints=1)
这会将一些空的艺术家对象添加到绘图中,然后用于填充图例。您可以通过空对象调整颜色、透明度等,这将反映在图例中。
我创建了一个同时使用颜色和标记大小以及独立维度的 3D 散点图。我添加了颜色条图例,但无法弄清楚如何为标记大小创建图例。
目前剧情是这样的:
例如:
Size | Label
0 | 'Small'
50 | 'Less Small'
100 | 'Getting There'
150 | 'Above Average'
200 | 'Pretty Big'
250 | 'Large'
这是生成情节的代码。输入变量 xp、yp、zp、cp 和 co 是我在别处生成的列表。
mat.style.use(['ggplot'])
fig = plt.figure(figsize=(20,15));
norm = mat.colors.Normalize(vmin=min(co), vmax=max(co))
mapper = cm.ScalarMappable(norm=norm, cmap=cm.RdBu)
cc = list()
for v in co:
cc.append(mapper.to_rgba(v))
ax = fig.add_subplot(111, projection='3d');
ax.scatter(xp, yp, zp, s=cp, c=cc, depthshade=True, linewidth=1, edgecolor='black');
mapper.set_array(cc)
plt.colorbar( mapper, label='Count' )
y = lambda x: (np.tanh(-x*50.)+1.)*250
x = np.arange(0,.05,.01)
sizes = y(x)
labels = x
# I can't figure out what to do here:
l = ax.legend(sizes, scatterpoints = len(sizes))
我发现执行此操作的最佳方法是添加一些用于构建图例的虚拟数据。
sizes = np.arange(0, 300, 50)
labels = ['size={0}'.format(s) for s in sizes]
points = [ax.scatter([], [], [], s=s, c='gray') for s in sizes]
plt.legend(points, labels, scatterpoints=1)
这会将一些空的艺术家对象添加到绘图中,然后用于填充图例。您可以通过空对象调整颜色、透明度等,这将反映在图例中。