代码之家  ›  专栏  ›  技术社区  ›  vladli

绘图仪中的对数色阶

  •  9
  • vladli  · 技术社区  · 6 年前

    我试图使用 Plotly Python3 。异常值会导致色阶图例看起来很糟糕:只有很少的高数据点,但图例看起来很糟糕:2k和10k之间的空间太大。

    所以问题是,如何改变右侧“颜色图例”的外观(见下图),使其大部分显示0到2k之间的差异?不幸的是,我无法从 this 文档文件

    示例代码(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

    我要找的是:

    Legend

    2 回复  |  直到 3 年前
        1
  •  3
  •   karel Aadil Minhaz    6 年前

    您可以通过定制 colorscale ,则, cmin cmax 属性的离散颜色更改正好为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
    新建地物结果

        2
  •  2
  •   el_Rinaldo    6 年前

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

    无论如何,您可以规范化颜色的值,并在更小的时间间隔内“压缩”数据。它在数学上表示数字的幂 E 必须提高以产生原始价值。如果您更习惯于使用log10,那么可以使用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之间,你能分辨出区别吗?