Skip to main content
 首页 » 编程设计

python之如何在 plotly scattergeo 美国 map 中使用离散色标

2025年01月19日33sharpest

当我使用 plotly(在 python 中)时,我正在尝试使用离散色阶。我需要一个离散色标,因为我为特定城市绘制的某些值与所有其他城市相比太大了,因此离散色标可以帮助我轻松地可视化所有值。这是一个更好地解释我的情况的例子: 我有一个数据集,其中包含按城市(在美国)划分的某些事件的详细信息。 该事件在纽约市发生了 50000 次,而在美国其他城市,同一事件发生的次数不到 1000 次。当我使用连续色标时,所有其他城市的值都下降到低端,纽约市是唯一使用色标顶部颜色的值。

提前感谢您的帮助! 此致, 里沙布

请您参考如下方法:

对于几个商店的 10 个不同的集群 ID,我就是这样生成 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 

然后,我在 plot 函数中使用了上面的色标:

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) 

它生成以下图。