初始化 Plotly 的 Scattergeo fig 的不同方法,一种不允许我“update_geos”,另一种我无法添加数据

Posted

技术标签:

【中文标题】初始化 Plotly 的 Scattergeo fig 的不同方法,一种不允许我“update_geos”,另一种我无法添加数据【英文标题】:Different ways to initialize Plotly's Scattergeo fig and one won't allow me to "update_geos" and the other I can't add data 【发布时间】:2021-12-13 22:29:49 【问题描述】:

我刚开始使用 Plotly,但在学习了几个教程后,我决定开始我自己的项目来研究公司的碳足迹。我配置了我自己的 JSON 数据并使用我想要的数据创建了一个 Scattergeo 图。当我想将边界从大陆更改为国家并将其更改为正交视图时,问题就出现了。从 Plotly 网站上,我找到了可以做到这一点的行:fig.update_geos(projection_type="orthographic, showcountries=True")

当我添加该代码时出现了我的问题,然后我得到了错误:AttributeError: 'dict' object has no attribute 'update_geos'

然后我意识到我做这件事的方式和它在 Plotly 网站上的显示方式是不同的。我首先像这样导入:from plotly.graph_objs import Scattergeo, Layoutfrom plotly import offline,从而创建了我的可视化。 Plotly 所做的只是这行:import plotly.graph_objects as go

我通过在字典中编写如下代码来定义我的数据:data = [],并将我的布局定义为my_layout = Layout(title='How you measure up: Companies'),然后创建无花果fig = 'data': data, 'layout': my_layout

在网站上,代码被简单地写为fig = go.Figure(go.Scattergeo()),它初始化了可视化和一切。

显然我学到了一种不同于 Plotly 使用的方法。我尝试以几种不同的方式混合我的代码以结合 Plotly 的代码和我的代码。我希望你们能够帮助我更改我自己的代码以允许 fig.update_geos 声明,或者向我指出一个教程或解决方案,在那里我可以学习如何将我自己的数据添加到 Plotly 的解决方案中。

我在下面附上我的和 Plotly 的代码,以防有人想看看,我希望这个问题描述了我的问题,但我认为它可能会有所帮助,即使它有点长。

我的代码;我不知道如何在视觉上更新它或将其更改为正交视图。

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

filename = 'compPrint1.json'
with open(filename) as f:
    all_json_data = json.load(f)

readable_file = 'readable_json_data.json'
with open(readable_file, 'w') as f:
    json.dump(all_json_data, f, indent=4)

#  cfp = Carbon FootPrint
companies, cfp, locations, lats, longs = [], [], [], [], []
for json_data in all_json_data:
    company = json_data['company']
    cp = json_data['carbonprint']
    location = json_data['location']
    lat = json_data['Latitude']
    long = json_data['Longitude']
    companies.append(company)
    cfp.append(cp)
    locations.append(location)
    lats.append(lat)
    longs.append(long)

companycfp = []
for json_data in all_json_data:
    comp = json_data['company']
    fp = json_data['carbonprint']
    stringfp = str(fp)
    compfp = f'comp, stringfp Million Metric Tons'
    companycfp.append(compfp)

data = [
    'type': 'scattergeo',
    'lon': longs,
    'lat': lats,
    'text': companycfp,
    'marker': 
        'size': [0.4*cp for cp in cfp],
        'color': cfp,
        'colorscale': 'fall',
    ,
]

my_layout = Layout(title='How you measure up: Companies')

fig = 'data': data, 'layout': my_layout

offline.plot(fig)

Plotly 网站代码;我不知道如何将上述数据添加到此视觉对象中。

import plotly.graph_objects as go

fig = go.Figure(go.Scattergeo())
fig.update_geos(projection_type="orthographic")
fig.update_layout(height=300, margin="r":0,"t":0,"l":0,"b":0)
fig.show()

非常感谢您的帮助!对不起,相当长的帖子。当谈到我尝试过的事情时,它并没有太多。我找不到很多关于我的情况的教程,到目前为止混合和匹配我的代码效果不是很好。

【问题讨论】:

一些观察 1) readable_file = 'readable_json_data.json' with open(readable_file, 'w') as f: json.dump(all_json_data, f, indent=4) 实际上什么都不做。打开一个文件,然后将另一个 dict 格式化为无功能目的的缩进。 2) 你正在努力操作 dict / JSON 以获得 pandas 的直截了当。这有什么原因吗? 3) 我可以从哪里获取您正在使用的 JSON? 1) 很高兴知道,我不一定知道我自己为什么要这样做,我遵循的教程包含该代码但没有太多解释,所以我只是认为这是必要的某些原因。 2) 与第一部分类似,我学到了更多关于 JSON 数据的知识,而不是关于 Pandas 的大量知识,所以我只是继续使用它,我将对学习 Pandas 进行更多研究,因为随着我学习的更多,它听起来更有效率。 3) 我从头开始创建了自己的 JSON 文件以适应我的数据,我可以在此处以某种方式共享它,但目前没有可以链接到的文件,因为它是我自己的数据。 【参考方案1】: 让您的代码运行,我已经处理了一些相同的数据,我可以说这些数据的形状与您的数据相同 由此看来,您正在做很多不必要的繁重工作。使用 Plotly Express。先决条件是将您的数据放入数据框中。我相信这只是使用构造函数。 那么整体解决方案就变得非常简单了

解决方案

import plotly.express as px

px.scatter_geo(
    pd.DataFrame(all_json_data),
    lat="Latitude",
    lon="Longitude",
    color="carbonprint",
    hover_data="company": True, "carbonprint": ":.2f",
).update_layout(geo="projection":"type":"orthographic")

让您的代码工作

import json
from plotly.graph_objs import Scattergeo, Layout
from plotly import offline
import pandas as pd
import numpy as np

# filename = 'compPrint1.json'
# with open(filename) as f:
#     all_json_data = json.load(f)

# readable_file = 'readable_json_data.json'
# with open(readable_file, 'w') as f:
#     json.dump(all_json_data, f, indent=4)
all_json_data = 
df2 = pd.read_html("https://www.latlong.net/category/cities-235-15.html")[0].rename(
    columns="Latitude": "Lat", "Longitude": "Lon"
)
df2 = df2.rename(
    columns="Place Name": "company", "Lat": "Latitude", "Lon": "Longitude"
).assign(carbonprint=np.random.uniform(1, 4, len(df2)), location=df2["Place Name"])
all_json_data = df2.to_dict("records")

#  cfp = Carbon FootPrint
companies, cfp, locations, lats, longs = [], [], [], [], []
for json_data in all_json_data:
    company = json_data["company"]
    cp = json_data["carbonprint"]
    location = json_data["location"]
    lat = json_data["Latitude"]
    long = json_data["Longitude"]
    companies.append(company)
    cfp.append(cp)
    locations.append(location)
    lats.append(lat)
    longs.append(long)

companycfp = []
for json_data in all_json_data:
    comp = json_data["company"]
    fp = json_data["carbonprint"]
    stringfp = str(fp)
    compfp = f"comp, stringfp Million Metric Tons"
    companycfp.append(compfp)

data = [
    
        "type": "scattergeo",
        "lon": longs,
        "lat": lats,
        "text": companycfp,
        "marker": 
            "size": [0.4 * cp for cp in cfp],
            "color": cfp,
            "colorscale": "fall",
        ,
    
]

my_layout = Layout(title="How you measure up: Companies")

fig = "data": data, "layout": my_layout

# offline.plot(fig)
go.Figure(fig)

【讨论】:

感谢您的回复非常有帮助。我将进一步了解 Pandas,因为它听起来是一种更好、更有效的数据组织方式。

以上是关于初始化 Plotly 的 Scattergeo fig 的不同方法,一种不允许我“update_geos”,另一种我无法添加数据的主要内容,如果未能解决你的问题,请参考以下文章

在 Jupyter Notebook 中的 plotly scattergeo 图中为每个数据点嵌入 URL?

在 F# 中使用 xplot/plotly 的连续误差带

如何在 F# 中使用 xplot/plotly 跳过图形块?

Plotly绘制树状热力图(treemap)Plotly实例教程

如何在 plotly (Python) 中解决此图例标签问题?

如何用plotly绘制椭球