You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Plotly绘图遇TypeError与ValueError:NoneType数值处理求助

问题:Plotly绘图时因震级数据含None导致的类型错误

出现的报错

TypeError(设置标记大小时)

'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]

尝试转换类型时的新错误

mag = int(mag)
          ^^^^^^^^
TypeError: int() argument must be a string, a bytes-like object or a real number, not 'NoneType'

完整代码

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')

问题原因

mags列表中混入了None值——虽然打印时能看到浮点数,但数据集中存在部分地震记录的震级字段为空(即eq_dict['properties']['mag']返回None),导致后续数值计算和Plotly渲染时触发类型错误。

解决办法

处理数据时过滤或替换None值,以下是两种可行方案:

方案1:过滤掉含None震级的记录

修改循环代码,仅保留有有效震级的数据:

all_eq_dicts = all_eq_data['features']
mags, lons, lats = [], [], []

for eq_dict in all_eq_dicts:
    mag = eq_dict['properties']['mag']
    # 仅当mag不为None时才添加数据
    if mag is not None:
        lon = eq_dict['geometry']['coordinates'][0]
        lat = eq_dict['geometry']['coordinates'][1]
        mags.append(mag)
        lons.append(lon)
        lats.append(lat)

方案2:给None值设置默认震级

如果不想丢弃数据,可为空震级设置默认值(比如0.0或数据集的最小震级):

for eq_dict in all_eq_dicts:
    mag = eq_dict['properties']['mag']
    # 若mag为None,设置默认值为0.0(可根据需求调整)
    mag = mag if mag is not None else 0.0
    lon = eq_dict['geometry']['coordinates'][0]
    lat = eq_dict['geometry']['coordinates'][1]
    mags.append(mag)
    lons.append(lon)
    lats.append(lat)

修改后重新运行代码,即可正常生成带大小和颜色区分的地震分布图。

内容的提问来源于stack exchange,提问作者lee_harvest

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 14:49:53