对数色标

2024-03-29 05:19:38 发布

您现在位置:Python中文网/ 问答频道 /正文

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

所以问题是,如何更改右边的“颜色图例”的外观(见下图),这样它将显示0到2k之间的差异?很遗憾,无法从thisdoc文件中获取答案

示例代码(jupyter笔记本):

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


Tags: 数据fromimportinitmodenprandomrgb
2条回答

既然你问的是一个精确的问题,我尽量用准确的答案回答,即使我不认为这不可能是最好的数据可视化。稍后我告诉你原因。在

总之,您可以规范化颜色的值,并在更小的间隔内“压缩”数据。它在数学上表示数值e必须提高到的幂才能产生原始值。如果你更习惯使用log10。在

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

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

{a1}

正如我所说的,用对数来转换价值并不总是如此。它实际上迫使观察者粗略地阅读图形。例如,尽管如此,在我的例子中橙色标记的范围在410和950之间,你能分辨出区别吗?在

您可以通过定制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)

New figure result
新图形结果

相关问题 更多 >