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
相关产品推荐
相关产品推荐

