python - 如何使用 matplotlib 为 3D 散点图创建标记大小图例?

标签 python matplotlib 3d legend scatter-plot

我创建了一个使用颜色和标记大小以及独立尺寸的 3D 散点图。我添加了颜色条图例,但不知道如何为标记大小创建图例。

目前,情节如下:

My current scatter plot: 理想情况下,我想创建一个具有 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)

这会向绘图添加一些空的艺术家对象,然后将其用于填充图例。您可以通过空对象调整颜色、透明度等,这将反射(reflect)在图例中。

关于python - 如何使用 matplotlib 为 3D 散点图创建标记大小图例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36696515/

相关文章:

python - 如何将参数传递给 Django 的自定义模板( block )标签

opencv - 两个 3D 点之间的 3D 旋转矩阵

javascript - Three.js - 更新的几何体不是渲染变化

c++ 如何在不进行深度复制的情况下展平 xtensor 的 View ?

python - 如何替换 Pandas 数据框中字符串中的子字符串

python - Python 中类似 C 的结构

Python/SQLAlchemy 迁移 - 迁移数据库中的更改时出现 "ValueError: too many values to unpack"

python - 如何制作按轴 1 分组的箱线图

python - 获取固定的图例颜色图

python - matplotlib 图例标签中保留的空白