Python 中 plotly express 散点图的大小图例

Size legend for plotly express scatterplot in Python

这是一个 Plotly Express 散点图,其标记颜色、大小和符号代表数据框中的不同字段。 symbol有legend,color有colorbar,但是没有说明marker size代表什么。

是否可以显示“尺寸”图例?在图例中,我希望展示一些示例标记尺寸及其各自的值。

类似的 被要求用于 R,我希望在 Python 中得到类似的结果。我试过使用 fig.add_trace() 添加标记,这可行,但我不知道如何使大小相等。

import pandas as pd
import plotly.express as px
import random

# create data frame
df = pd.DataFrame({
  'X':list(range(1,11,1)),
  'Y':list(range(1,11,1)),
  'Symbol':['Yes']*5+['No']*5,
  'Color':list(range(1,11,1)),
  'Size':random.sample(range(10,150), 10)
})

# create scatterplot
fig = px.scatter(df, y='Y', x='X',color='Color',symbol='Symbol',size='Size')

# move legend
fig.update_layout(legend=dict(y=1, x=0.1))

fig.show()

散点图图像:

谢谢

如果您使用范围内的指标 scale/data,则无法实现此目标。 Plotly 将尝试始终将其解释为公制,即使它 seems/is 在输出中是离散的。所以你的数据必须是一个因素,就像在 R 中一样,因为你正在显示组。一种可能的解决方案是使用列表组件。并将所有内容转换为 str。我分两步完成,所以你可以按照:

import pandas as pd
import plotly.express as px
import random


check = sorted(random.sample(range(10,150), 10))
check = [str(num) for num in check]

# create data frame
df = pd.DataFrame({
  'X':list(range(1,11,1)),
  'Y':list(range(1,11,1)),
  'Symbol':['Yes']*5+['No']*5,
  'Color':check,
  'Size':list(range(1,11,1))
})

# create scatterplot
fig = px.scatter(df, y='Y', x='X',color='Color',symbol='Symbol',size='Size')

# move legend
fig.update_layout(legend=dict(y=1, x=0.1))

fig.show()

这给出了:

请记住,您还会获得符号标签,因为您现在有两个组! 也许您想在转换为字符串之前 sort 列表中的值! 就像这张图(添加到上面的代码中)

更新

嘿,

是的,但据我所知,仅在 matplotlib 中,而且它在模拟散点图时有点老套。我只能给你看一个来自 matplotlib 的修改示例,但也许它对你有帮助,所以你可以 fiddle 自己解决:

from numpy.random import randn

z = randn(10)

red_dot, = plt.plot(z, "ro",  markersize=5)
red_dot_other, = plt.plot(z*2, "ro", markersize=20)

plt.legend([red_dot, red_dot_other], ["Yes", "No"], markerscale=0.5)

这给出:

如您所见,您正在处理两个不同的图,确切地说,每个尺寸图例对应一个图。在传说中,这些地块合并在一起。 Legendsize 通过 markerscale 进一步引导,并链接到每个地块的 markersize。因为我们有两个具有两个不同标记大小的图,所以我们可以在图例中创建一个具有不同标记大小的图。 markerscale 通常是一个介于 0 和 1 之间的值,但你也可以做 150%,即 1.5。

您可以通过摆弄 matplotlib 中的图例处理程序来实现此目的,请参见此处: https://matplotlib.org/stable/tutorials/intermediate/legend_guide.html