Skip to main content
 首页 » 编程设计

python之制作具有多个轨迹的 Plotly Scattermapbox 的函数失败,Plotly,列表理解

2024年09月03日36lori

我正在尝试使用列表理解来创建 data Plotly 的属性 Scattermapbox .

这是 df:

import plotly.plotly as py 
import plotly.graph_objs as go 
import pandas as pd 
 
df = pd.DataFrame( 
    {"BOROUGH": ['MANHATTAN','MANHATTAN','MANHATTAN','QUEENS', 'QUEENS', 'QUEENS'], 
     "CALL_QTY":[100, 10, 5, 15, 30, 45], 
     "lat":[40.75, 40.72, 40.73, 40.72, 70.71, 40.721], 
     "lng":[-73.99, -73.98, -70.97, -73.74, -73.73, -73.72]}) 

这是我要遍历的元组:

u_sel = [list(a) for a in zip(['MANHATTAN', 'QUEENS'], # names 
                              ['blue', 'orange'],      # colors 
                              [0.6, 0.7])]             # opacity 

这是我创建的使用列表理解的函数:

def scattermap_data(df, u_sel): 
    return([go.Scattermapbox( 
        lat = df.loc[df['BOROUGH']==b].lat.astype('object'), 
        lon = df.loc[df['BOROUGH']==b].lng.astype('object'), 
        mode = 'markers', 
        marker = dict( 
            size=df.loc[df['BOROUGH']==b].CALL_QTY, 
            sizeref=0.9, 
            sizemode='area', 
            color=color, 
            opacity=opacity 
        ) 
    )] for b, color, opacity in u_sel 
    ) 

问题:当我尝试运行以下命令时:

data = scattermap_data(df, u_sel) 
layout = go.Layout(autosize=False, 
                   mapbox= dict( 
                       accesstoken=mapbox_access_token, 
                       zoom=10, 
                       style = 'dark', 
                       center= dict( 
                           lat=40.721319, 
                           lon=-73.987130) 
                   ), 
                   title = "O God, Why?") 
fig = dict(data=data, layout=layout) 
py.iplot(fig, filename='tmapbox') 

ValueError: Invalid value of type 'builtins.generator' received for the 'data' property of Received value: <generator object scattermap_data.<locals>.<genexpr> at 0x000000000A72AF68>

我的问题:我的印象是这个单一的 df 将被分解成两个 scattermapbox 跟踪元素的实例 - data 的结构,上面会是这样的:

data = [trace1, trace2] 

(这看起来在格式上类似于许多 plotly 示例,其中跟踪列表构成 data 中 dict 的 fig 参数。

如果我对 go.Scattermapbox 进行两条单独的跟踪,则此示例确实有效但是我有几个需要这个多重跟踪属性的地 block ,我不想为每个地 block 重复代码(即为每个地 block 制作 2 个不同的 trace 实例。我觉得我接近让它工作但是我只需要一些调整。

辅助信息:Plotly v. 3.3.0,python 3.6,我是列表理解和 plotly 的新手,非常感谢任何帮助。

编辑:添加了 import声明以防阻碍任何人。 edit2:改进的问题陈述,标题

请您参考如下方法:

我想通了我的问题:我应该在函数的返回值中使用 list() 而不是方括号。

def scattermap_data(df, u_sel): 
    return(list(go.Scattermapbox( 
        lat = df.loc[df['BOROUGH']==b].lat.astype('object'), 
        lon = df.loc[df['BOROUGH']==b].lng.astype('object'), 
        mode = 'markers', 
        marker = dict( 
            size=df.loc[df['BOROUGH']==b].CALL_QTY, 
            sizeref=0.9, 
            sizemode='area', 
            color=color, 
            opacity=opacity 
        ) 
    ) for b, color, opacity in u_sel) 
)