有没有一种方法可以计算出Scatter3d的最佳sizeref值

时间:2019-08-08 16:37:54

标签: python r plotly

我正在使用奇妙的绘图库绘制3D散点图,并试图确定如何计算气泡的大小。

请注意,除了气泡的大小应与“ size”属性中的数据值成比例外,数据并不是那么重要(在这里很难显示)。不幸的是,该数据的值不时变化,因此设置固定的“大小”值是不实际的。 plotly提供了“ sizeref”属性(请参见下面的代码),该属性可缩放气泡的大小。我已经找到了一个公式(在绘图站点上)适用于2D,但似乎不适用于3D图表。

我的问题是:是否有一个方便的公式来计算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)

1 个答案:

答案 0 :(得分:1)

我在Plotly Express中使用的公式是:https://github.com/plotly/plotly.py/blob/master/packages/python/plotly/plotly/express/_core.py#L760

sizeref = df["size_column"].max() / max_size ** 2

一些注意事项:

  • 此公式假设sizemodearea而不是diameter,这是人类在感知尺寸时会做的在感知上最佳的事情。如果要使用diameter模式,可以使用sizeref = df["size_column"].max() / max_size
  • 此公式未考虑“最小”大小,因为当数据为0时,Plotly始终认为最小大小为0。您无法将任意范围映射到大小。 sizemin参数是一个“剪切”参数,意味着任何大小“将”小于sizemin的标记都将在sizemin处呈现
  • Plotly Express中max_size的默认值为20,我发现15到60之间的值看起来不错,这取决于数据和子图的数量等。