如何基于日期为地图气泡设置不同颜色并实现计数驱动的气泡半径
没问题!我帮你修改这两个脚本,实现按日期给气泡设置不同颜色的需求,同时保留气泡半径基于记录计数的逻辑。下面是具体的方案:
一、Folium 脚本修改方案
首先我们需要先处理日期字段,把带时间的created_at转换成纯日期,这样才能区分11月24日和25日的记录。然后根据你的需求,有两种分组方式可选:
方式1:同一经纬度下不同日期的气泡分开显示
如果希望同一个位置在两天的记录分别显示为独立气泡,就按「经纬度+日期」分组,这样每个气泡对应某天的记录数:
import pandas as pd import folium # 加载数据集 df = pd.read_csv("autostrada_a_6.csv", delimiter=';', error_bad_lines=False) # 处理日期:将字符串转成datetime,提取纯日期部分 df['created_date'] = pd.to_datetime(df['created_at'], format='%d/%m/%Y %H:%M:%S').dt.date # 按经纬度+日期分组,统计每组的记录数 locations = df.groupby(by=['latitudine', 'longitudine', 'created_date'])['created_at'].count().sort_values(ascending=False) locations = locations.reset_index(name='value') # 创建基础地图 m = folium.Map(location=[df['latitudine'].mean(), df['longitudine'].mean()], tiles="Stamen Toner", zoom_start=8) # 定义半径规则(和你原逻辑一致) def get_radius(freq): if freq < 5: return 5 elif freq < 15: return 15 else: return 45 # 日期-颜色映射:24日用深红色,25日用蓝色(可根据喜好调整) color_map = {pd.Timestamp('2019-11-24').date(): 'crimson', pd.Timestamp('2019-11-25').date(): 'blue'} # 添加每个气泡到地图 for _, row in locations.iterrows(): folium.CircleMarker( location=[row['latitudine'], row['longitudine']], radius=get_radius(row['value']), color=color_map[row['created_date']], fill=True, fill_color=color_map[row['created_date']], fill_opacity=0.7 # 增加透明度,避免重叠遮挡 ).add_to(m) m
方式2:同一经纬度的气泡合并,按主要日期着色
如果希望同一个位置的气泡合并成一个,用该位置记录数最多的日期作为颜色依据,可以用下面的代码:
import pandas as pd import folium df = pd.read_csv("autostrada_a_6.csv", delimiter=';', error_bad_lines=False) df['created_date'] = pd.to_datetime(df['created_at'], format='%d/%m/%Y %H:%M:%S').dt.date # 统计每个经纬度下各日期的记录数 date_counts = df.groupby(['latitudine', 'longitudine', 'created_date'])['created_at'].count().unstack(fill_value=0) # 获取每个位置记录最多的日期 date_counts['main_date'] = date_counts.idxmax(axis=1) # 计算该位置的总记录数 date_counts['total_value'] = date_counts.sum(axis=1) # 整理成需要的格式 locations = date_counts.reset_index()[['latitudine', 'longitudine', 'total_value', 'main_date']] m = folium.Map(location=[df['latitudine'].mean(), df['longitudine'].mean()], tiles="Stamen Toner", zoom_start=8) def get_radius(freq): if freq < 5: return 5 elif freq < 15: return 15 else: return 45 color_map = {pd.Timestamp('2019-11-24').date(): 'crimson', pd.Timestamp('2019-11-25').date(): 'blue'} for _, row in locations.iterrows(): folium.CircleMarker( location=[row['latitudine'], row['longitudine']], radius=get_radius(row['total_value']), color=color_map[row['main_date']], fill=True, fill_color=color_map[row['main_date']], fill_opacity=0.7 ).add_to(m) m
二、Basemap 脚本修改方案
你的原脚本有几个小问题:比如未定义的data变量、字段名错误(homelon/homelat应该是longitudine/latitudine)、直接对created_at做factorize会因为时间不同生成太多标签。下面是修复并实现需求的版本:
from mpl_toolkits.basemap import Basemap import matplotlib.pyplot as plt import pandas as pd # 加载数据集 df = pd.read_csv("autostrada_a_6.csv", delimiter=';', error_bad_lines=False) # 处理日期字段,提取纯日期 df['created_date'] = pd.to_datetime(df['created_at'], format='%d/%m/%Y %H:%M:%S').dt.date # 按经纬度+日期分组,统计记录数 locations = df.groupby(by=['latitudine', 'longitudine', 'created_date'])['created_at'].count().reset_index(name='value') # 设置画布大小 plt.rcParams["figure.figsize"] = 15, 10 # 创建Basemap实例(保持你的投影和边界设置) m = Basemap(llcrnrlon=-180, llcrnrlat=-65, urcrnrlon=180, urcrnrlat=80, projection='merc') m.drawmapboundary(fill_color='#A6CAE0', linewidth=0) m.fillcontinents(color='grey', alpha=0.3) m.drawcoastlines(linewidth=0.1, color="white") # 将经纬度转换为Basemap的投影坐标 x, y = m(locations['longitudine'].values, locations['latitudine'].values) # 给日期分配标签:0对应24日,1对应25日 locations['label'] = pd.factorize(locations['created_date'])[0] # 绘制散点图:半径s基于记录数(乘以系数调整大小,可自行修改),颜色c基于日期标签 scatter = m.scatter( x=x, y=y, s=locations['value'] * 2, # 系数2可以根据气泡大小需求调整 alpha=0.4, c=locations['label'], cmap="Set1" # Set1的前两种颜色正好区分两天 ) # 添加颜色图例,方便识别日期 plt.legend(handles=scatter.legend_elements()[0], labels=['2019-11-24', '2019-11-25'], title="日期") plt.show()
关键修改点说明:
- 修复了字段名错误,确保用数据集里的
latitudine和longitudine - 先提取纯日期再做factorize,确保只有两个标签对应两天的记录
- 用分组后的记录数作为
s参数的依据,乘以系数调整气泡大小 - 添加了颜色图例,让日期和颜色的对应关系更清晰
内容的提问来源于stack exchange,提问作者Rachele Franceschini
相关产品推荐
相关产品推荐

