【问题标题】:Logarithmic color scale in plotly绘图中的对数色标
【发布时间】:2018-10-27 18:38:25
【问题描述】:

我正在尝试使用 PlotlyPython3 可视化包含一些异常值的数据。异常值导致色标图例看起来很糟糕:只有很少的高数据点,但图例看起来很糟糕:2k 和 10k 之间的空间太大。

那么问题来了,如何改变右边“颜色图例”的外观(见下图),所以它会主要显示 0 到 2k 之间的差异?不幸的是,无法从this doc 文件中得到答案

示例代码(jupyter notebook):

import numpy as np
from plotly.offline import download_plotlyjs, init_notebook_mode, iplot
from plotly.graph_objs import *
init_notebook_mode()

x = np.random.randn(100,1) + 3
y = np.random.randn(100,1) + 10
x = np.reshape(x, 100)
y = np.reshape(y, 100)

color = np.random.randint(0,1000, [100])
color[[1,3,5]] = color[[1,3,5]] + 10000 # create outliers in color var

trace = Scatter(
    x = x,
    y = y,
    mode = 'markers',
    marker=dict(
        color = color,
        showscale=True,
        colorscale = [[0, 'rgb(166,206,227, 0.5)'],
                      [0.05, 'rgb(31,120,180,0.5)'],
                      [0.1, 'rgb(178,223,138,0.5)'],
                      [0.15, 'rgb(51,160,44,0.5)'],
                      [0.2, 'rgb(251,154,153,0.5)'],
                      [1, 'rgb(227,26,28,0.5)']
                     ]
    )
)

fig = Figure(data=[trace])
iplot(fig)

我在寻找什么:

【问题讨论】:

  • 我觉得这个问题不清楚。您是否需要以某种方式切割 2k 和 10k 之间的颜色条?
  • 我想拉伸 0 和 2k 之间的距离,这样更容易看出那里的差异,这会缩短 2k 和 10k 之间的距离,因为它并没有真正显示任何东西对我有帮助
  • 不幸的是,我认为这不能在情节中完成。把你的问题放在我的收藏夹里,因为我也有兴趣。感谢询问
  • 仅在图例中拉伸 [0,2K] 是不可能的 AFAIK。我认为您需要的是数据的日志转换,而不仅仅是图例。你说传说没用,其实连剧情都不好读,我们只能看到一堆点“在”10左右。
  • 我想我可以想出一个更好的例子。即使您删除了 x 和 y 的“异常值”,只留下“离群值”的颜色 - 图例的问题仍然存在。我会在一分钟内更新示例。

标签: python python-3.x jupyter-notebook plotly


【解决方案1】:

既然你问了一个精确的问题,我试着用一个精确的答案来回答,即使我不认为这在数据可视化方面不是最好的。稍后我会告诉你原因。

无论如何,您可以标准化颜色值并在更小的间隔内“压缩”您的数据。它在数学上表示数字 e 必须提高到产生原始值的幂。如果您觉得更舒服,可以使用 log10。

代码非常非常简单,我只附上跟踪定义,其余不变。为方便起见,我放置了一个标准 cmap,因为值的间隔是连续的。

trace = Scatter(
    x = x,
    y = y,
    mode = 'markers',
    marker=dict(
        color = np.log(color),
        showscale=True,
        colorscale = 'RdBu'
    )
)

正如我所说,使用 log 转换值并不总是最好的。它实际上迫使观察者粗略阅读图表。例如,在我的示例中,橙色标记的范围在 410 和 950 之间,你能分辨出区别吗?

【讨论】:

  • 这不是我想要做的。我在谈论更接近于这个的东西:link(我的编辑技术不是很好:p)
【解决方案2】:

您可以通过自定义 colorscalecmincmax 属性来完成我认为您所追求的目标,使其在 2000 处具有离散的颜色变化。然后您可以自定义 colorbar.tickvals 以标记边界如 2000 年。见 https://plot.ly/python/reference/#scatter-marker-colorbar

import numpy as np
from plotly.offline import download_plotlyjs, init_notebook_mode, iplot
from plotly.graph_objs import *
init_notebook_mode()

x = np.random.randn(100,1) + 3
y = np.random.randn(100,1) + 10
x = np.reshape(x, 100)
y = np.reshape(y, 100)

color = np.random.randint(0,1000, [100])
color[[1,3,5]] = color[[1,3,5]] + 10000 # create outliers in color var

bar_max = 2000
factor = 0.9  # Normalized location where continuous colorscale should end

trace = Scatter(
    x = x,
    y = y,
    mode = 'markers',
    marker=dict(
        color = color,
        showscale=True,
        cmin=0,
        cmax= bar_max/factor,
        colorscale = [[0, 'rgb(166,206,227, 0.5)'],
                      [0.05, 'rgb(31,120,180,0.5)'],
                      [0.2, 'rgb(178,223,138,0.5)'],
                      [0.5, 'rgb(51,160,44,0.5)'],
                      [factor, 'rgb(251,154,153,0.5)'],
                      [factor, 'rgb(227,26,28,0.5)'],
                      [1, 'rgb(227,26,28,0.5)']
                     ],
        colorbar=dict(
            tickvals = [0, 500, 1000, 1500, 2000],
            ticks='outside'
        )
    )
)

fig = Figure(data=[trace])
iplot(fig)


新图结果

【讨论】:

  • 接受为迄今为止的最佳答案
猜你喜欢
  • 2020-12-26
  • 2014-08-02
  • 2014-12-18
  • 2016-03-22
  • 1970-01-01
  • 2013-06-09
  • 1970-01-01
  • 2012-07-27
  • 1970-01-01
相关资源
最近更新 更多