【问题标题】:How can I customize the colorbar in plotly scattergeo?如何在 plotly scattergeo 中自定义颜色条?
【发布时间】:2020-03-07 12:26:54
【问题描述】:

我从 NASA 地球数据网站(南美洲的火灾)中提取了一些火灾数据,并将这些数据绘制在世界地图上。我使用颜色条来显示每个火焰的亮度。

火焰的亮度变化与全色阶范围不对应,并且大多数火焰的颜色相同(黄色)。这是我的代码:

import csv

from plotly.graph_objs import Scattergeo, Layout
from plotly import offline

filename = 'data/MODIS_C6_South_America_24h.csv'
with open(filename) as f:
    reader = csv.reader(f)
    header_row = next(reader)
    print(header_row)

    # Get latitudes, longitudes and brightness from this file.

    lats, lons, brights = [], [], []
    for row in reader:
        lat = float(row[0])
        lats.append(lat)
        lon = float(row[1])
        lons.append(lon)
        bright = float(row[2])
        brights.append(bright)

# Map the fires
data = [{
    'type': 'scattergeo',
    'lon': lons,
    'lat': lats,
    'marker': {
        'size': [1/30* bright for bright in brights],
        'color': brights,
        'colorscale': 'Inferno',
        'reversescale': True,
        'colorbar': {'title': 'Brightness'},
    },
}]
my_layout = Layout(title='South America Fires\npast 24 hours')

fig = {'data': data, 'layout': my_layout}
offline.plot(fig, filename='south_america_fires.html')

我能否以某种方式更改色阶的限制,以使标记具有更广泛的颜色范围并更好地区分?还是有更好的策略?

【问题讨论】:

    标签: python plotly plotly-python


    【解决方案1】:

    火的亮度变化不对应于 全色阶范围

    是的,他们有。看看你的数据的更简单的可视化:

    图 1: Seaborn 分布图

    代码 1: Seaborn 分布图

    import seaborn as sns
    import numpy as np
    sns.set(color_codes=True)
    sns.distplot(tuple(brights))
    

    您的情节最终看起来如此,原因有以下三个:

    1. brightness = 330 周围有 许多 观察
    2. 很少观察到较亮的火焰
    3. 最重要的是,标记会按照它们在数据集中出现的顺序添加到图中

    因此,如果您只是对数据进行排序以确保较亮的火焰不会被较不明亮的火焰覆盖,您会得到:

    *情节 2: 使用 brights.sort()brights 进行排序

    我认为应该解决这个问题:

    [...] 以便标记具有更广泛的颜色范围并更好地区分?

    所以真的没有必要担心这个:

    我可以以某种方式更改色阶的限制 [...]

    可以考虑对您的数据进行日志重新编码。我测试了它,但它并没有产生太大的视觉差异。请注意,我删除了 'size': [1/60* bright for bright in brights] 部分。我认为情节 2 看起来比这更好:

    完整代码:

    import csv
    
    from plotly.graph_objs import Scattergeo, Layout
    from plotly import offline
    
    filename = 'C:\\pySO\\MODIS_C6_South_America_24h.csv'
    with open(filename) as f:
        reader = csv.reader(f)
        header_row = next(reader)
        print(header_row)
    
    # Get latitudes, longitudes and brightness from this file.
    
        lats, lons, brights = [], [], []
        for row in reader:
            lat = float(row[0])
            lats.append(lat)
            lon = float(row[1])
            lons.append(lon)
            bright = float(row[2])
            brights.append(bright)
    
    brights.sort()
    
    # Map the fires
    data = [{
        'type': 'scattergeo',
        'lon': lons,
        'lat': lats,
        'marker': {
            #'size': [1/60* bright for bright in brights],
            'color': brights,
            #'color': brights.sort(),
            'colorscale': 'Inferno',
            'reversescale': True,
            'colorbar': {'title': 'Brightness'},
        },
    }]
    my_layout = Layout(title='South America Fires\npast 24 hours')
    
    fig = {'data': data, 'layout': my_layout}
    offline.plot(fig, filename='south_america_fires.html')
    

    【讨论】:

    • 嗨@vestland:非常感谢!看起来很棒!我会在安静的一分钟内仔细看看......现在,非常感谢!
    • 嗨@vestland。好的,主要问题是大量不太明亮的火焰的标记覆盖了明亮火焰的标记......对我来说很有意义:-) sort() 方法确保绘制明亮的火焰(较暗的颜色)序列中的最后一个。凉爽的。非常感谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-06
    • 1970-01-01
    • 2022-10-19
    • 1970-01-01
    相关资源
    最近更新 更多