You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何基于日期为地图气泡设置不同颜色并实现计数驱动的气泡半径

没问题!我帮你修改这两个脚本,实现按日期给气泡设置不同颜色的需求,同时保留气泡半径基于记录计数的逻辑。下面是具体的方案:

一、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()

关键修改点说明:

  1. 修复了字段名错误,确保用数据集里的latitudine和longitudine
  2. 先提取纯日期再做factorize,确保只有两个标签对应两天的记录
  3. 用分组后的记录数作为s参数的依据,乘以系数调整气泡大小
  4. 添加了颜色图例,让日期和颜色的对应关系更清晰

内容的提问来源于stack exchange,提问作者Rachele Franceschini

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.27 22:07:27