Как использовать дискретную цветовую шкалу в плотно нанесенной карте США - PullRequest
0 голосов
/ 26 апреля 2018

Я пытаюсь использовать дискретную цветовую шкалу, когда я использую plotly (в python).Мне нужна отдельная шкала цветов, так как некоторые значения, которые я строю для определенных городов, слишком велики по сравнению со всеми другими, поэтому дискретная шкала цветов поможет мне с легкостью визуализировать все значения.Вот пример, чтобы лучше объяснить мою ситуацию: у меня есть набор данных, который содержит информацию о некоторых событиях по городам (в США).Событие произошло в Нью-Йорке 50000 раз, тогда как в других городах США такое же событие произошло менее 1000 раз.Когда я использую непрерывную цветовую шкалу, все другие значения города попадают в нижний предел, и NYC является единственным значением, в котором используется цвет в верхней части цветовой шкалы.

Заранее спасибо за помощь!С наилучшими пожеланиями, Rishabh

1 Ответ

0 голосов
/ 27 декабря 2018

Для 10 различных идентификаторов кластера для нескольких магазинов, вот как я сгенерировал 10 отдельных цветовых шкал:

import matplotlib

def matplotlib_to_plotly(cmap, pl_entries):
# Converts matplotlib colormap to plotly colormap. It also shuffles the color map

    h = 1.0/(pl_entries)
    pl_colorscale = []
    c_order = h * np.arange(pl_entries+1)
    c_order_shuffled = c_order.copy()
    # Shuffles the colormap
    np.random.shuffle(c_order_shuffled)
    for i in range(pl_entries):
        C = map(np.uint8, np.array(cmap(c_order_shuffled[i])[:3])*255)
        pl_colorscale.append([c_order[i], 'rgb'+str((C[0], C[1], C[2]))])
        # To have clear boundaries between colors in the colorbar
        if i < (pl_entries):
             pl_colorscale.append([c_order[i+1], 'rgb'+str((C[0], C[1], C[2]))])
    return pl_colorscale

# Sets the colormap of your choice 
cmap = matplotlib.cm.get_cmap('jet')
# Passes the number of distinct colors you need to generate. In this case we have 10 cluster ids in stores_info_df
custom_colorscale = matplotlib_to_plotly(cmap, stores_info_df['CLUSTER_ID'].max())
custom_colorscale

enter image description here

Затем я использовалвышеуказанная цветовая шкала в функции графика:

def visualize_geo_store_clusters(stores_info_df, fig_name='store_similarity_US_map', cluster_id = 'CLUSTER_ID'):

    max_cluster_id = stores_info_df[cluster_id].max()

    data = [ dict(
        type = 'scattergeo',
        locationmode = 'USA-states',
        lon = stores_info_df['LONGTITUDE'],
        lat = stores_info_df['LATITUDE'],
        text = stores_info_df['TEXT'],
        mode = 'markers',
        marker = dict(
            colorscale= custom_colorscale, 
            cmin = stores_info_df[cluster_id].min(),
            color = stores_info_df[cluster_id],
            cmax = max_cluster_id,
            colorbar = dict(
                title = 'Cluster ID',
                titleside = 'top',
                tickmode = 'array',
                tickvals =  np.arange(1, max_cluster_id+1),
                ticktext = np.arange(1, max_cluster_id+1),
                #ticks = 'outside',
            )

        ))]

     layout = dict(
        title = 'Similarity between Stores',
        geo = dict(
            scope='usa',
            projection=dict( type='albers usa' ),
            showland = True,
            landcolor = "rgb(250, 250, 250)",
            subunitcolor = "rgb(217, 217, 217)",
            countrycolor = "rgb(217, 217, 217)",
            countrywidth = 0.5,
            subunitwidth = 0.5
        ),
    )

fig = dict(data=data, layout=layout)
plotly.offline.iplot(fig, validate=False)

Создает следующий график.

enter image description here

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