Логарифмическая цветовая гамма в сюжете - PullRequest
0 голосов
/ 17 мая 2018

Я пытаюсь визуализировать данные с некоторыми выбросами, используя Plotly и Python3. Из-за выбросов легенда о цветовой шкале выглядит плохо: верхних точек данных немного, но легенда выглядит плохо: пространство между 2k и 10k слишком велико.

Итак, вопрос в том, как изменить вид «цветовой легенды» справа (см. Изображение ниже), чтобы она показывала разницу между 0 и 2k в основном? К сожалению, не удалось получить ответ от этого файла документа

Пример кода (блокнот 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

Ответы [ 2 ]

0 голосов
/ 09 июня 2018

Вы можете достичь того, что вам нужно, настроив свойства 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
Новый результат фигуры

0 голосов
/ 21 мая 2018

Поскольку вы задали точный вопрос, я стараюсь отвечать точным ответом, даже если не думаю, что это не может быть лучшим в визуализации данных. Позже я покажу вам, почему.

В любом случае, вы можете нормализовать значения цветов и «сжать» ваши данные за гораздо меньший интервал. Он математически представляет степень, до которой число 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, вы можете заметить разницу?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...