我正在使用奇妙的plotly库绘制3D散点图,并试图确定如何计算气泡的大小。
请注意,数据并不那么重要(在这里很难显示),气泡的大小应该与“size”属性中的数据值成比例。不幸的是,该数据的值随时间而变化,因此设置固定的“大小”值是不实际的。plotly提供了“sizeref”属性(见下面的代码),它可以缩放气泡的大小。我发现了一个公式(在plotly网站上),适用于2D,但似乎不适用于3D图表。
我的问题是:是否有一个方便的公式来计算sizeref的值?我认为sizeref公式将取决于数据的最大/最小值(即。“size”属性的数据)和布局大小(800高度和800宽度,按照下面的代码)。我尝试了一些我自己的公式,但没有一个工作得很好。
任何想法将不胜感激(注:我正在使用Python,但我怀疑解决方案也适用于R中的plotly代码)。
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)
2条答案
按热度按时间watbbzwu1#
我在Plotly Express中使用的公式如下:https://github.com/plotly/plotly.py/blob/8445f916fa84fe17cfc15e95354c0a870113ad8c/packages/python/plotly/plotly/express/_core.py#L1721
一些注意事项:
sizemode
是area
,而不是diameter
,这是考虑到人类如何感知大小的感知最佳方法。如果你想使用diameter
模式,你可以使用sizeref = df["size_column"].max() / max_size
sizemin
参数是一个“裁剪”参数,这意味着任何大小“可能”小于sizemin
的标记都以sizemin
呈现max_size
的默认值是20,我发现15到60之间的值看起来不错,这取决于数据和子图的数量等。ckx4rj1h2#
创建一个新列“log_yvalues”,并使用log值作为大小变量,在大多数情况下应该足够好,也可以处理足够极端的情况。
只要确保你有一种方法来处理0,负,空值。