我刚刚熟悉 Plotly。我尝试根据幅度值为绘图上的每个标记制作不同的大小,这发生了:
'size': [5*mag for mag in mags],
~^~~~
TypeError: unsupported operand type(s) for *: 'int' and 'NoneType'
此外,设置颜色时出现 ValueError:
ValueError:
Invalid element(s) received for the 'color' property of scattergeo.marker
Invalid elements include: [None]
如果我猜对了,Python 不会将 mags 列表中的值识别为数字。完整代码如下:
from plotly.graph_objs import Scattergeo, Layout
from plotly import offline
import json
filename = "past_30.geojson"
with open(filename, encoding='utf-8') as f:
all_eq_data = json.load(f)
readable_file_1 = 'readable_eq_data.json'
with open(readable_file_1, 'w') as f:
json.dump(all_eq_data, f, indent=4)
all_eq_dicts = all_eq_data['features']
mags, lons, lats = [], [], []
for eq_dict in all_eq_dicts:
mag = eq_dict['properties']['mag']
lon = eq_dict['geometry']['coordinates'][0]
lat = eq_dict['geometry']['coordinates'][1]
mags.append(mag)
lons.append(lon)
lats.append(lat)
data = [{
'type': 'scattergeo',
'lon': lons,
'lat': lats,
'marker': {
'size': [5*mag for mag in mags],
'color': mags,
'colorscale': 'Viridis',
'reversescale': True,
'colorbar': {'title': 'Magnitude'},
},
}]
my_layout = Layout(title='Global Earthquakes')
fig = {'data': data, 'layout': my_layout}
offline.plot(fig, filename='glob_eq.html')
我尝试通过放置
int()
和 float()
来解决这个问题,但这两种方式最终都导致了另一个 TypeError:
mag = int(mag)
^^^^^^^^
TypeError: int() argument must be a string, a bytes-like object or a real number, not 'NoneType'
我检查了 mags 列表本身(
print(mags)
),我相信它包含浮点数:
[2.07, 2.07, 2.2, 3.3, 1.91, 1.89, 1.6, 1.76...]
我在使用函数时遇到了类似的问题,但将
return
放在最后每次都解决了问题。
我错过了什么吗?
错误消息表明
mags
包含 None
。您可以通过检查语句 None in mags
返回 True
来验证这一点。
您需要以某种方式填充 mags 中的
None
值。根据您的用例,您可以按照注释中的建议选择默认值,或者估算平均值、中位数或其他一些单独值。您还可以从 mags
数组中删除 None 值,但这需要您调整传递到数据字典的其他数组的长度。