对数色标在图中

时间:2018-05-17 13:12:42

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

我正在尝试使用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)

Plot

2 个答案:

答案 0 :(得分:1)

您可以通过自定义colorscalecmincmax属性来完成我认为您所追求的目标,以便在2000处进行离散颜色更改。然后您可以自定义{ {1}}将边界标记为2000.请参阅https://plot.ly/python/reference/#scatter-marker-colorbar

colorbar.tickvals

New figure result
新数字结果

答案 1 :(得分:0)

由于您提出了一个确切的问题,我尝试回答一个精确的答案,即使我认为这不是数据可视化中最好的。后来我告诉你原因。

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

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

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

enter image description here

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