问题描述
我正在开展一个 Dash Plotly 项目,该项目将美国总统选举数据可视化。我的项目的一个部分显示了可以通过选择不同的州来更改的县区域分布图。这张地图的右侧是任何县的每次选举中双方获得的选票百分比。第二个图表是通过点击 choropleth 县地图来填充的。
这一切正常,但我遇到的问题是,当我切换状态时,等值线图更新得很好,但第二个图变空白,直到我再次单击地图才会填充。
>我试图通过将第二个图表设置为在单击县之前切换状态时首先按字母顺序显示第一个县来解决此问题。但是,它似乎无法正常工作。
这是我的代码的简短片段:
MySet({'b','c','a'})
New_name({'b','a'})
有人可以帮我找到我遗漏的部分吗?任何帮助,将不胜感激! 谢谢!
解决方法
问题出在您的 update_figure4
回调中的这一行(在 else
语句中):
county_id = new_df["County"][0]
如果您加载页面并在下拉列表中选择 District of Columbia
,则 new_df["County"]
的值如下:
3 District of Columbia
7 District of Columbia
11 District of Columbia
Name: County,dtype: object
如您所见,返回的数据中没有索引为 0
的行,因此 new_df["County"][0]
将失败。
new_df["County"][3]
在这种情况下可以工作,但问题当然是,当您访问它时,数据集中可能并不总是有索引为 3
的行在回调中。
改为使用 iloc
:
county_id = new_df["County"][0]
根据评论更新
如果我只点击一个县,然后从下拉菜单中切换到一个新的州,第二个图表就会再次变为空白
这样做的原因是您还需要考虑选择县的情况,但该县与下拉列表中选择的州不对应。
由于您的 else
子句中已经有逻辑,如果没有选择县,则为右侧的图表提供默认值,因此当点击数据中的县不对应时,您可以使用相同的逻辑选择的状态。
所以你可以这样做:
if click_county_select:
new_df = data[data["State"] == state_select]
county_id = click_county_select["points"][0]["customdata"][3]
new_df2 = new_df[new_df["County"] == county_id]
counties = new_df["County"].values
if county_id not in counties:
new_df = data[data["State"] == state_select]
county_id = new_df["County"].iloc[0]
new_df2 = new_df[new_df["County"] == county_id]
else:
new_df = data[data["State"] == state_select]
county_id = new_df["County"].iloc[0]
new_df2 = new_df[new_df["County"] == county_id]
现在我只是懒洋洋地复制粘贴了新的 else
语句中 if
子句中的代码,但是您可以在其自己的函数中提取重用的逻辑并多次调用它符合不要重复自己。