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 的解决方案也可以。