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",
},
)
)
我正在使用 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",
},
)
)