我正在使用神奇的绘图库来绘制 3D 散点图,并尝试确定如何计算气泡的大小。
请注意,数据并不那么重要(并且很难在此处显示),除了气泡的大小应随“大小”属性中的数据值缩放之外。不幸的是,该数据的值会随着时间的推移而变化,因此设置固定的“大小”值是不切实际的。 plotly 提供了“sizeref”属性(参见下面的代码)来缩放气泡的大小。我发现了一个适用于 2D 但似乎不适用于 3D 图表的公式(在plotly 网站上)。
我的问题是:有没有一个方便的公式来计算 sizeref 的值?我认为 sizeref 公式将取决于数据的最大/最小值(即“size”属性的数据)和布局大小(按照下面的代码,高度为 800,宽度为 800)。我尝试了一些我自己的公式,但没有一个效果很好。
任何想法将不胜感激(注意:我使用Python,但我怀疑该解决方案适用于 R 中的绘图代码)。
import plotly
import plotly.graph_objs as go
#
# The dataframe, df, is calculated elsewhere
#
x = list(df["comp-0"])
y = list(df["comp-1"])
z = list(df["comp-2"])
text = list(df["label"])
color = list(df["cluster"])
size = list(df["degree"])
sizeref = 50
sizemin = 1
trace1 = go.Scatter3d(
x=x, y=y, z=z,
text=text,
mode="markers",
marker=dict(
sizemode="diameter",
sizeref=sizeref,
sizemin=sizemin,
size=size,
color=color,
colorscale="Viridis",
line=dict(color="rgb(150, 150, 150)")
)
)
data = [trace1]
title = "Clusters"
layout = go.Layout(height=800, width=800, title=title)
fig = go.Figure(data=data, layout=layout)
plotly.offline.plot(fig)
我在 Plotly Express 中使用的公式在这里:https://github.com/plotly/plotly.py/blob/8445f916fa84fe17cfc15e95354c0a870113ad8c/packages/python/plotly/plotly/express/_core.py#L1721
sizeref = df["size_column"].max() / max_size ** 2
一些注意事项:
sizemode
是 area
而不是 diameter
,考虑到人类如何感知大小,这是感知上的最佳做法。如果您想使用 diameter
模式,您可以使用 sizeref = df["size_column"].max() / max_size
sizemin
参数是一个“裁剪”参数,意味着任何尺寸“将”小于 sizemin
的标记都会在 sizemin
max_size
的默认值为 20,我发现 15 到 60 之间的值看起来不错,具体取决于数据和子图数量等。创建一个新列“log_yvalues”并使用日志值,因为大小变量在大多数情况下应该足够好,并且还可以处理足够的极端情况。
只要确保你有办法处理 0、负值、空值即可。