Pandas绘制经纬度散点图(点权重为房屋中位数价值)的正确性与优化问询
问题解答
1. 关于“点权重”的含义
这里的“点权重”指的是用散点的大小来映射“房屋中位数价值”这个数值——房价越高,对应的点就越大,通过视觉上的大小差异,能快速直观地看出不同经纬度区域的房价分布规律。
2. 当前代码的正确性
你写的代码是正确的:
train.plot.scatter(x = 'longitude', y = 'latitude', s = 'median_house_value');
pandas的scatter绘图方法中,s参数正是用来控制点的尺寸,完全符合“点权重用房屋中位数价值表示”的要求。
不过有个小细节要注意:如果median_house_value的数值本身很大(比如动辄几十万),画出来的点可能会过大甚至重叠,影响视觉效果。这时候可以给数值加个缩放系数,比如:
train.plot.scatter(x = 'longitude', y = 'latitude', s = train['median_house_value'] / 100);
把数值缩小100倍,点的大小会更适中。
3. 减少图中点数的方法
如果原始数据量太大,点太多导致图太拥挤,推荐这几种方法:
随机抽样:直接从数据集中抽取一部分样本绘图,既能减少点数,又能保留整体分布特征:
# 随机抽取5000条样本,数量可以自己调整 sample_data = train.sample(n=5000) sample_data.plot.scatter(x='longitude', y='latitude', s=sample_data['median_house_value']/100);也可以按比例抽样,比如抽30%的数据:
sample_data = train.sample(frac=0.3)经纬度分箱聚合:把经纬度划分成网格,每个网格内计算房价中位数,用聚合后的点代替原始点,能大幅减少点数,同时更清晰展示区域房价趋势:
# 把经度、纬度各分成20个区间(bins数量可调整) train['lon_bin'] = pd.cut(train['longitude'], bins=20) train['lat_bin'] = pd.cut(train['latitude'], bins=20) # 按分箱分组,计算每组的房价中位数 agg_data = train.groupby(['lon_bin', 'lat_bin'])['median_house_value'].median().reset_index() # 取每个分箱的中点作为绘图坐标 agg_data['lon_mid'] = agg_data['lon_bin'].apply(lambda x: x.mid) agg_data['lat_mid'] = agg_data['lat_bin'].apply(lambda x: x.mid) # 绘制聚合后的散点图 agg_data.plot.scatter(x='lon_mid', y='lat_mid', s=agg_data['median_house_value']/100);
内容的提问来源于stack exchange,提问作者snaigy
相关产品推荐
相关产品推荐

