Plotly - 密度地图框不直观显示

Plotly - Density Mapbox not displaying intuitively

我正在使用 plotly 来可视化有关户外社交情绪的数据。目前选择的可视化是密度图框,但我对其他工具、图表等持开放态度,只要它们具有交互性和相对于时间/随时间可视化的能力。

这是我的代码:

import plotly.express as px
fig = px.density_mapbox(df
                        ,lat='lat'
                        ,lon='long'
                        ,z='Tweets'
                        ,hover_name='Location'
                        ,hover_data={'lat':False # remove from hover data
                                     ,'long':False # remove from hover data
                                     ,'Tweets':':.0f' # keep 
                                     ,'Nature':':.0f' # display 
                                    }
                        ,center=dict(lat=39, lon=-99)
                        ,zoom=2.95
                        ,mapbox_style="carto-positron"
                        ,opacity = 0.3
                        ,radius = 22.5
                        ,range_color = [0,250000]
                        ,color_continuous_scale='inferno'
                       )

fig.add_scattermapbox(lat = df['lat']
                      ,lon = df['long']
                      ,hoverinfo = 'skip'         
                      ,below= ''             
                      ,marker_size= 2
                      ,marker_color= 'rgb(128, 128, 128)'

这里是 link 在 df 中找到的数据。 Link here

然而,输出并不完全符合我的预期。

在第一张图片中,您可以看到该特定区域的推文总数超过 1,000,000 条。您会想象这会在密度地图框中创建很多 'heat',但事实并非如此。将其与图二进行比较,其中可能有 20 多个区域,每个区域有 50,000 到 100,000 条推文。图 1 和图 2 的相关区域的推文总数相同,但显示方式不同,不是我想要的方式。

此外,在图三中,有大约 7,000 条推文。 7000肯定是在做图时设定的范围内,但可能是因为7000相对于250000+实在是微不足道,密度图框上都没有显示出来

简而言之,有没有办法显示每个数据点的完整半径,即使是无关紧要的数据点,并显示更多 'heat' 来自远远超过颜色条范围的值以获得更真实的可视化效果?

提前致谢。

  • 您的示例数据存在一些问题。 位置不可用所以我模拟了它。某些数据点不在 State column
  • 状态
  • density_mapbox 正在按预期工作。颜色基于地理位置的密度
df.groupby([df["lat"].round(0), df["long"].round(0)]).agg(
    {"Tweets": "sum", "Location": list}
).reset_index().sort_values("Tweets", ascending=False).head(10)


lat long Tweets Location
30 -93 1.195e+06 ['LA_0']
30 -91 944000 ['LA_1']
39 -122 826257 ['CA_0', 'CA_1', 'CA_2', 'CA_3', 'CA_4']
39 -91 633529 ['MO_10', 'MO_12', 'IL_1', 'IL_2', 'IL_10', 'IL_11', 'IL_12']
40 -90 242675 ['IL_15', 'IL_18', 'IL_28']
41 -89 164785 ['IL_14', 'IL_16', 'IL_17']
34 -90 162660 ['MS_5', 'MS_6', 'MS_7', 'MS_10']
40 -95 131837 ['MO_11', 'MO_14', 'MO_15']
40 -91 128180 ['MO_17', 'IL_6', 'IL_8', 'IL_13']
37 -90 117082 ['MO_1', 'MO_6', 'MO_8', 'MO_18']

解决方案

  • 添加一个额外的轨迹,它是一个 Scattermapbox 大小基于 *Tweets 并使用与 [= 相同的颜色42=]
import plotly.express as px

df = pd.read_excel("https://github.com/jkiefn1/Plotly_SO/blob/main/test_df.xlsx?raw=true")
# simulate location....  not in sample data
df["Location"] = df.groupby("State", as_index=False)["State"].transform(lambda s: [f"{s}_{i}" for i, s in enumerate(s)])

fig = px.density_mapbox(df
                        ,lat='lat'
                        ,lon='long'
                        ,z='Tweets'
                        ,hover_name='Location'
                        ,hover_data={'lat':False # remove from hover data
                                     ,'long':False # remove from hover data
                                     ,'Tweets':':.0f' # keep 
                                     ,'Nature':':.0f' # display 
                                    }
                        ,center=dict(lat=39, lon=-99)
                        ,zoom=2.95
                        ,mapbox_style="carto-positron"
                        ,opacity = 0.3
                        ,radius = 22.5
                        ,range_color = [0,250000]
                        ,color_continuous_scale='inferno'
                       )

fig.add_trace(
    go.Scattermapbox(
        lat=df["lat"],
        lon=df["long"],
        mode="markers",
        showlegend=False,
        hoverinfo="skip",
        marker={
            "color": df["Tweets"],
            "size": df["Tweets"].fillna(0),
            "coloraxis": "coloraxis",
            # desired max size is 15. see https://plotly.com/python/bubble-maps/#united-states-bubble-map
            "sizeref": (df["Tweets"].max()) / 15 ** 2,
            "sizemode": "area",
        },
    )
)