【问题标题】:plotly graph object colors to similar将对象颜色绘制为相似
【发布时间】:2022-01-06 23:23:01
【问题描述】:

我尝试使用 plotly 图形对象绘制值,并使用一列来设置颜色。

fig_1.add_trace(
    go.Scattermapbox(
            lat=data.latitude, 
            lon=data.longitude,
            marker=go.scattermapbox.Marker(size=9, color=data.id_nr),   
            )
        )

但是,这些值是非常高的数字(id 编号,int64),因此,彼此更接近的 id 编号(100k 不同而不是 1M)将显示为几乎相同的颜色。

有没有办法将颜色设置为离散颜色?使用

... color=data.id_nr.astype(str) 

在 Plotly express 中用于使冷却器分离的方法不起作用。

收到的“颜色”属性无效元素 scattermapbox.marker

基本问题是:您能否设置颜色以使每个值(无论 delta 有多近或多远)都获得唯一的颜色?


编辑: id 值更像:

id=[1,2,5,100004,100007,100009]

结合 plotly 的连续着色,前三个和后三个颜色相同。 Plotly express 通过将(id 的)int 值更改为字符串来解决这个问题,使它们离散。


EDIT2:

解决方案是按 ID 分隔数据,然后为每个 ID 添加跟踪。然而,这不是......“性感”,我宁愿知道一个解决方案,可以离散地处理颜色。

【问题讨论】:

    标签: python plot plotly


    【解决方案1】:

    我通过将official reference 中的示例改编为您的作业,重新创建了数据并创建了代码。数据的格式是一个三列的数据框:id列、经纬度、位置名称。在marker的定义中,我使用了id列来定义颜色,并指定'Viridis'作为色标,这是一个连续的色图。有关在散点图中引入色标的具体example,请参阅此内容。

    import pandas as pd
    import plotly.express as px
    
    lat = [38.91427,38.91538,38.91458,38.92239,38.93222,38.90842,38.91931,38.93260,38.91368,38.88516,38.921894,38.93206, 38.91275]
    lon = [-77.02827,-77.02013,-77.03155,-77.04227,-77.02854,-77.02419,-77.02518,-77.03304,-77.04509,-76.99656,-77.042438,-77.02821,-77.01239]
    name = ["The coffee bar","Bistro Bohem","Black Cat", "Snap","Columbia Heights Coffee","Azi's Cafe", "Blind Dog Cafe","Le Caprice","Filter","Peregrine","Tryst","The Coupe","Big Bear Cafe"]
    ids =  [1,2,3,4,5001,5002,5003,5004,100004,100007,100009,100010,100011]
    colors = px.colors.qualitative.Alphabet[:len(lat)]
    
    df = pd.DataFrame({'id':ids, 'lat':lat,'lon':lon,'name':name,'colors': colors})
    
    df.head()
        id  lat     lon     name    colors
    0   1   38.91427    -77.02827   The coffee bar  #AA0DFE
    1   2   38.91538    -77.02013   Bistro Bohem    #3283FE
    2   3   38.91458    -77.03155   Black Cat   #85660D
    3   4   38.92239    -77.04227   Snap    #782AB6
    4   5001    38.93222    -77.02854   Columbia Heights Coffee     #565656
    
    import plotly.graph_objects as go
    
    mapbox_access_token = open("mapbox_api_key.txt").read()
    
    fig = go.Figure(go.Scattermapbox(
            lat=df['lat'],
            lon=df['lon'],
            mode='markers',
            marker=go.scattermapbox.Marker(
                size=16,
                color=df['colors'],
                #colorscale='Viridis'
            ),
            text=df['name'],
        ))
    
    fig.update_layout(
        autosize=False,
        width=1000,
        height=500,
        hovermode='closest',
        mapbox=dict(
            accesstoken=mapbox_access_token,
            bearing=0,
            center=dict(
                lat=38.92,
                lon=-77.07
            ),
            pitch=0,
            zoom=11
        ),
    )
    
    fig.show()
    

    【讨论】:

    • 感谢您提供深入的代码。下次我应该提供一个工作示例。但是,问题在于,id 值更像:[1,2,3,100000,100002,100003]。这导致情节认为前三个和后三个属于一起,或者更好地说,它使用连续着色,最终前三个和后三个在非常相似的颜色范围内。更改色阶不会改变它。在 ploty express 中,这是通过将 int 转换为字符串来离散化颜色来解决的。但这在这里是不可能的。
    • 我希望从一开始就有对 id 示例的解释,但我认为您可以通过创建一个具有此 id 的列并给定任意颜色并用颜色定义它来绘制预期的图形。
    • 注释内容现在反映在代码和图表中。使用定性颜色制作色标以匹配数据中的颜色数量。您的数据中有多少个唯一编号的 id?按颜色进行可视化有其局限性,因此通常使用颜色来区分分组。
    • 对于 ID 的后期编辑感到抱歉。非常感谢您的更新版本。这对死人。我使用了一个随机颜色生成器,它可以工作,但随机 :-) 所以有时我会达到很好的分色效果,有时不会。你的好多了。干杯
    猜你喜欢
    • 2023-04-02
    • 2015-10-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多