初始化 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, Layout
和from 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 跳过图形块?
Plotly绘制树状热力图(treemap)Plotly实例教程