Python 叶热图不随强度变化
Python folium heatmap not changing with intensity
我试图在下面的代码中更改热图中梯度的归一化值,但是当我更改系数值时,hot/cold 的分布不会改变。根据我将该系数设置的值,它应该在某些地方变得“更热”或“更冷”。就好像它根本没有获得“重量”值。谁能告诉我哪里出错了?
def generateBaseMap(loc, zoom=11, tiles='OpenStreetMap', crs='ESPG2263'):
return folium.Map(location=loc,
control_scale=True,
zoom_start=zoom,
tiles=tiles)
MAP = [34.02571149, -118.366837957]
base_map = generateBaseMap(MAP)
map_values = geo_stat_list_final[['ID','SecondID','Lat','Long','MoneyTotal']]
map_values['weight']=map_values['MoneyTotal']/5000
map_values1 = map_values[['Lat','Long','weight']]
data = map_values1.values.tolist()
hm = plugins.HeatMap(data,gradient={0.1: 'blue', 0.3: 'lime', 0.5: 'yellow', 0.7: 'orange', 1: 'red'},
min_opacity=0.05,
max_opacity=0.9,
radius=8,
use_local_extrema=False)
base_map.add_child(hm)
我有 运行 你的代码在我自己的样本数据上,它正确地显示了热图。我会回复示例数据和代码。
import pandas as pd
import numpy as np
import random
import folium
from folium.plugins import HeatMap
lat = [random.uniform(33.5, 34.5) for x in range(100)]
lon = [random.uniform(-118.5,-117.5) for x in range(100)]
geo_stat_list_final = pd.DataFrame({'Lat':lat,'Long':lon,'MoneyTotal': np.random.randint(1000,5000,100)})
geo_stat_list_final['weight'] = geo_stat_list_final['MoneyTotal'] / 5000
def generateBaseMap(loc, zoom=9, tiles='OpenStreetMap', crs='ESPG2263'):
return folium.Map(location=loc,
control_scale=True,
zoom_start=zoom,
tiles=tiles)
MAP = [34.02571149, -118.366837957]
base_map = generateBaseMap(MAP)
map_values1 = geo_stat_list_final[['Lat','Long','weight']]
data = map_values1.values.tolist()
hm = HeatMap(data,gradient={0.1: 'blue', 0.3: 'lime', 0.5: 'yellow', 0.7: 'orange', 1: 'red'},
min_opacity=0.05,
max_opacity=0.9,
radius=25,
use_local_extrema=False)#.add_to(base_map)
#base_map
base_map.add_child(hm)
data[:5] # 5 datas from first
[[33.8480473952464, -118.14858383423282, 0.3592],
[34.06851003550549, -117.541725793199, 0.5726],
[33.5701211585705, -118.24992088097929, 0.41],
[34.411085864993666, -117.79288874325837, 0.6426],
[34.24806484620283, -117.95844340200593, 0.5752]]
由于您对 folium 热图有疑问并且正在寻找不同的方法,我将以 plotly density 热图的示例作为一个建议来回应。如果以点为单位缩小半径,则会丢失细节。色标由问题中的自定义颜色设置。 reference.
的官方参考可以在这里找到
import pandas as pd
import numpy as np
import random
import plotly.graph_objects as go
lat = [random.uniform(33.5, 34.5) for x in range(100)]
lon = [random.uniform(-118.5,-117.5) for x in range(100)]
geo_stat_list_final = pd.DataFrame({'Lat':lat,'Long':lon,'MoneyTotal': np.random.randint(1000,5000,100)})
geo_stat_list_final['weight'] = geo_stat_list_final['MoneyTotal'] / 5000
fig = go.Figure(go.Densitymapbox(lat=geo_stat_list_final.Lat,
lon=geo_stat_list_final.Long,
z=geo_stat_list_final.weight,
radius=40,
colorscale=[[0.0, 'blue',],[0.3,'lime'],[0.5,'yellow'],[0.7,'orange'],[1.0, 'red']],# custome colorscale
zmin=0.0,
zmax=1.0
))
fig.update_layout(mapbox_style="carto-positron",
mapbox_center_lon=-118.366837957,
mapbox_center_lat=34.02571149,
mapbox_zoom=8)
fig.update_layout(margin={"r":0,"t":0,"l":0,"b":0})
fig.show()
在热图方面,Folium 似乎有一个严重缺陷——它完全忽略了“权重”或 z 特征。我花了很多时间解决这个问题,但最终还是从 github 那里遇到了这个问题:
https://github.com/python-visualization/folium/issues/1271
显然,即使在今天,Folium 仍然忽略了数据点的权重。地图的“热”,完全是由于数据点的接近,而不是特征的强度。
对于使用 Folium 制作热图的不知情的人来说,这是一个重大的失望和令人难以置信的误导。我正在寻找 Folium 之外的热图解决方案。
编辑:HeatMapWithTime 似乎仍然可以正常工作。无论出于何种原因,阻止常规热图工作的错误都不会影响具有时间索引的地图。因此,如果您迫切需要 Folium 中的缩放功能,请创建一个时间索引并将其与 HeatMapWithTime 一起使用。
或者,r-beginners 使用 Plotly 的解决方案也可以。
我试图在下面的代码中更改热图中梯度的归一化值,但是当我更改系数值时,hot/cold 的分布不会改变。根据我将该系数设置的值,它应该在某些地方变得“更热”或“更冷”。就好像它根本没有获得“重量”值。谁能告诉我哪里出错了?
def generateBaseMap(loc, zoom=11, tiles='OpenStreetMap', crs='ESPG2263'):
return folium.Map(location=loc,
control_scale=True,
zoom_start=zoom,
tiles=tiles)
MAP = [34.02571149, -118.366837957]
base_map = generateBaseMap(MAP)
map_values = geo_stat_list_final[['ID','SecondID','Lat','Long','MoneyTotal']]
map_values['weight']=map_values['MoneyTotal']/5000
map_values1 = map_values[['Lat','Long','weight']]
data = map_values1.values.tolist()
hm = plugins.HeatMap(data,gradient={0.1: 'blue', 0.3: 'lime', 0.5: 'yellow', 0.7: 'orange', 1: 'red'},
min_opacity=0.05,
max_opacity=0.9,
radius=8,
use_local_extrema=False)
base_map.add_child(hm)
我有 运行 你的代码在我自己的样本数据上,它正确地显示了热图。我会回复示例数据和代码。
import pandas as pd
import numpy as np
import random
import folium
from folium.plugins import HeatMap
lat = [random.uniform(33.5, 34.5) for x in range(100)]
lon = [random.uniform(-118.5,-117.5) for x in range(100)]
geo_stat_list_final = pd.DataFrame({'Lat':lat,'Long':lon,'MoneyTotal': np.random.randint(1000,5000,100)})
geo_stat_list_final['weight'] = geo_stat_list_final['MoneyTotal'] / 5000
def generateBaseMap(loc, zoom=9, tiles='OpenStreetMap', crs='ESPG2263'):
return folium.Map(location=loc,
control_scale=True,
zoom_start=zoom,
tiles=tiles)
MAP = [34.02571149, -118.366837957]
base_map = generateBaseMap(MAP)
map_values1 = geo_stat_list_final[['Lat','Long','weight']]
data = map_values1.values.tolist()
hm = HeatMap(data,gradient={0.1: 'blue', 0.3: 'lime', 0.5: 'yellow', 0.7: 'orange', 1: 'red'},
min_opacity=0.05,
max_opacity=0.9,
radius=25,
use_local_extrema=False)#.add_to(base_map)
#base_map
base_map.add_child(hm)
data[:5] # 5 datas from first
[[33.8480473952464, -118.14858383423282, 0.3592],
[34.06851003550549, -117.541725793199, 0.5726],
[33.5701211585705, -118.24992088097929, 0.41],
[34.411085864993666, -117.79288874325837, 0.6426],
[34.24806484620283, -117.95844340200593, 0.5752]]
由于您对 folium 热图有疑问并且正在寻找不同的方法,我将以 plotly density 热图的示例作为一个建议来回应。如果以点为单位缩小半径,则会丢失细节。色标由问题中的自定义颜色设置。 reference.
的官方参考可以在这里找到import pandas as pd
import numpy as np
import random
import plotly.graph_objects as go
lat = [random.uniform(33.5, 34.5) for x in range(100)]
lon = [random.uniform(-118.5,-117.5) for x in range(100)]
geo_stat_list_final = pd.DataFrame({'Lat':lat,'Long':lon,'MoneyTotal': np.random.randint(1000,5000,100)})
geo_stat_list_final['weight'] = geo_stat_list_final['MoneyTotal'] / 5000
fig = go.Figure(go.Densitymapbox(lat=geo_stat_list_final.Lat,
lon=geo_stat_list_final.Long,
z=geo_stat_list_final.weight,
radius=40,
colorscale=[[0.0, 'blue',],[0.3,'lime'],[0.5,'yellow'],[0.7,'orange'],[1.0, 'red']],# custome colorscale
zmin=0.0,
zmax=1.0
))
fig.update_layout(mapbox_style="carto-positron",
mapbox_center_lon=-118.366837957,
mapbox_center_lat=34.02571149,
mapbox_zoom=8)
fig.update_layout(margin={"r":0,"t":0,"l":0,"b":0})
fig.show()
在热图方面,Folium 似乎有一个严重缺陷——它完全忽略了“权重”或 z 特征。我花了很多时间解决这个问题,但最终还是从 github 那里遇到了这个问题:
https://github.com/python-visualization/folium/issues/1271
显然,即使在今天,Folium 仍然忽略了数据点的权重。地图的“热”,完全是由于数据点的接近,而不是特征的强度。
对于使用 Folium 制作热图的不知情的人来说,这是一个重大的失望和令人难以置信的误导。我正在寻找 Folium 之外的热图解决方案。
编辑:HeatMapWithTime 似乎仍然可以正常工作。无论出于何种原因,阻止常规热图工作的错误都不会影响具有时间索引的地图。因此,如果您迫切需要 Folium 中的缩放功能,请创建一个时间索引并将其与 HeatMapWithTime 一起使用。 或者,r-beginners 使用 Plotly 的解决方案也可以。