【问题标题】:Problem with missing values in Altair or Plotly choropleth mapAltair 或 Plotly 等值线图中缺失值的问题
【发布时间】:2021-12-31 21:00:41
【问题描述】:

我有美国几个州的数据,而其他州的数据为空。在创建地图时,我想在文本中缺失值的状态中添加阴影,但我正在努力寻找正确的方法。使用我当前的代码,我无法获取整个美国地图,包括具有 Null 值的州,并且只会弹出具有特定分配值的州。我还查看了之前发布的问题并尝试对地图进行分层,但这给了我一个错误。 here's how cc_df looks like

这是我的代码:

# import the required library
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt# import seaborn library
%matplotlib inline
import altair as alt
from vega_datasets import data

# State database
states_df = pd.read_csv(
    'https://www2.census.gov/geo/docs/reference/state.txt',
# pipe seperated file
sep="|",
# FIPS are best as strings
dtype='str',
# rename columns
header=0, names=['state_fips', 'state', 'state_name', 'StateENS'],
# drop last column
usecols=['state_fips', 'state_name', 'state']
).set_index('state')
states_df['id'] = states_df['state_fips'].astype(int)

# The data to map
cc_df = pd.read_csv('hv_cwad.csv',
                    usecols=['state', 'CWAD'])
cc_df = cc_df.groupby('state').mean()

# Combine state database and our own data
#cc_state_df = pd.merge(cc_df, states_df)
cc_state_df = states_df.join(cc_df).reset_index()

# %%
# Create the map
states = alt.topo_feature(data.us_10m.url, 'states')
variable_list = ['CWAD']

alt.Chart(states).mark_geoshape(stroke='lightgrey',
                                strokeWidth=.5).encode(
    alt.Color(alt.repeat('row'), type='quantitative')
).transform_lookup(
    lookup='id',
    from_=alt.LookupData(cc_state_df, 'id', variable_list)
).properties(
    width=300,
    height=300
).project(
    type='albersUsa'
).repeat(
    row=variable_list
).resolve_scale(
    color='independent'
)

输出如下所示:

【问题讨论】:

  • 我也尝试过将两张地图分层。这就是代码的样子 #Adding an outline to the map outline = alt.Chart(states).mark_geoshape(stroke='black').project( type='albersUsa' ).properties( #width=700, #height=400 ) alt.layer(plot,outline) 但这给了我一个 ValueError: Repeat charts cannot be layered
  • 我认为您可以重复分层图表(其他方式)。我试图复制+粘贴你的代码,但我得到了FileNotFoundError: [Errno 2] No such file or directory: 'hv_cwad.csv
  • Mattjin,我添加了数据框 (cc_df) 的快照。我认为我们不能在此处添加 csv 文件。您能否澄清一下“其他方式”的含义?
  • 我运行了您的代码并确认未显示 NA 状态。当我将缺失的数据值更新为 0 时,所有状态都显示出来了。如果这是您想要的,我会回复。
  • @r-beginners 是的,拜托。谢谢你。正如您在输出图中看到的那样,只有带有数据的状态看起来很奇怪。我试图以灰色添加没有数据的州,或者至少是缺少数据的州的轮廓。

标签: python plotly data-visualization altair choropleth


【解决方案1】:

我知道你指出的点是问题,所以我对 NaN 值做了一些研究,发现了following answers。但是空值的条件判断不起作用,所以我用-1替换了缺失值,得到了想要的输出。

import pandas as pd
import matplotlib.pyplot as plt
import altair as alt
from vega_datasets import data

# State database
states_df = pd.read_csv('https://www2.census.gov/geo/docs/reference/state.txt', 
                        sep="|", 
                        dtype='str', 
                        header=0, 
                        names=['state_fips', 'state', 'state_name', 'StateENS'],
                        usecols=['state_fips', 'state_name', 'state']).set_index('state')

states_df['id'] = states_df['state_fips'].astype(int)

import io

data = '''
state CWAD
AR 377.715148
FL 6560.929494
GA 1958.122132
IA 0.409179
KS 63.706671 
'''

cc_df = pd.read_csv(io.StringIO(data), delim_whitespace=True)
# The data to map
#cc_df = pd.read_csv('hv_cwad.csv', usecols=['state', 'CWAD'])
cc_df = cc_df.groupby('state').mean()

# Combine state database and our own data
#cc_state_df = pd.merge(cc_df, states_df)
cc_state_df = states_df.join(cc_df).reset_index()
cc_state_df.fillna(-1, inplace=True)

# Create the map
states = alt.topo_feature(data.us_10m.url, 'states')

variable_list = ['CWAD']

alt.Chart(states).mark_geoshape(
    stroke='lightgrey',
    strokeWidth=.5
).encode(
        color=alt.condition('datum.CWAD !== -1', 'CWAD:Q', alt.value('lightgray'))
).transform_lookup(
    lookup='id',
    from_=alt.LookupData(
        cc_state_df,
        'id',
        variable_list)
).properties(
    width=300,
    height=300
).project(
    type='albersUsa'
).repeat(
    row=variable_list
).resolve_scale(
    color='independent'
)

【讨论】:

  • 如果我的回答对你有帮助,请考虑采纳为正确答案
  • 感谢您的努力。我修改了代码并用 0 代替了 NA 替换了缺失的状态。问题在于某些州的 CWAD 值为 100 或更低。因此,丢失的数据状态看起来像它们的 CWAD 值较低,而不是根本没有数据。
  • 谢谢。这绝对是一个很好的解决方法。我尝试了您的解决方案,它适用于这个特定的数据集,因为我的所有数据都有正值。看起来我们现在有两个解决方案:#Altair 和 plotly :)
  • 我认为这对您来说是一个满意的答案。你现在可以接受我的回答了。
【解决方案2】:

我能够使用 Plotly 而不是 Altair 绘制丢失的数据。如果您不特别喜欢使用 Altair,这可能会有所帮助。

导入需要的库

导入 plotly.graph_objects 将 numpy 导入为 np 将熊猫导入为 pd 将 matplotlib.pyplot 导入为 plt %matplotlib 内联 将 altair 导入为 alt 从 vega_datasets 导入数据

# State database
states_df = pd.read_csv(
    'https://www2.census.gov/geo/docs/reference/state.txt',
# pipe seperated file
sep="|",
# FIPS are best as strings
dtype='str',
# rename columns
header=0, names=['state_fips', 'state', 'state_name', 'StateENS'],
# drop last column
usecols=['state_fips', 'state_name', 'state']
).set_index('state')
states_df['id'] = states_df['state_fips'].astype(int)

# The data to map
cc_df = pd.read_csv('cwad_hv.csv',
                    usecols=['state', 'GWAD'])
cc_df = cc_df.groupby('state').mean()

# Combine state database and our own data
#cc_state_df = pd.merge(cc_df, states_df) #don't use this. 
cc_state_df = states_df.join(cc_df).reset_index()
#cc_state_df.fillna(0, inplace=True)#This changes the states with no data from NA to zero. If your data has a range -ve to +ve, skip this.

fig = go.Figure(data=go.Choropleth(
    locations=cc_state_df['state'],
    z=cc_state_df['CWAD'].astype(float),
    locationmode='USA-states',
    #color='Greens',
    autocolorscale=True,
    #range_color=[0, 6500],
    #text=df['text'], # hover text
    marker_line_color='black', # line markers between states
    colorbar_title="CWAD kg/ha"
))

fig.update_layout(
    title_text='CWAD',
    geo = dict(
        scope='usa',
        projection=go.layout.geo.Projection(type = 'albers usa'),
        showlakes=False, # lakes
        lakecolor='rgb(255, 255, 255)'),
)

fig.show()

Here is the output

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-13
    • 2020-01-13
    • 2020-12-24
    • 2015-11-09
    • 1970-01-01
    • 2021-02-23
    • 2021-06-13
    相关资源
    最近更新 更多