如何用R的ggplot2绘制带单个椭圆的地理单元散点图
嘿,这个需求用Python的matplotlib就能完美实现!我给你一步步拆解,附上可直接复用的代码:
核心思路
每个地理单元的椭圆以(X,Y)为中心,东西向直径对应椭圆的水平宽度,南北向直径对应椭圆的垂直高度。我们先画散点,再逐个叠加椭圆,同时要保证坐标轴比例一致,避免椭圆变形。
代码实现(以Pandas数据集为例)
假设你的数据已经用Pandas读入成DataFrame,直接运行下面的代码即可:
import matplotlib.pyplot as plt from matplotlib.patches import Ellipse import pandas as pd # 模拟你的数据集(替换成你自己的真实数据) data = pd.DataFrame({ 'X': [1, 3, 5, 2], 'Y': [2, 4, 1, 3], '南北直径': [0.8, 1.2, 0.6, 1.0], '东西直径': [1.5, 2.0, 1.0, 1.8] }) # 创建绘图对象 fig, ax = plt.subplots(figsize=(8, 6)) # 先绘制散点图(zorder让散点显示在椭圆上方) ax.scatter(data['X'], data['Y'], color='#ff4444', s=50, zorder=2) # 遍历每个数据点,绘制对应椭圆 for _, row in data.iterrows(): # 初始化椭圆:中心坐标、水平宽度(东西直径)、垂直高度(南北直径) ellipse = Ellipse( xy=(row['X'], row['Y']), width=row['东西直径'], height=row['南北直径'], edgecolor='#33b5e5', facecolor='none', # 空心椭圆,若要填充可改为颜色值如'#33b5e580' linewidth=1.5, zorder=1 ) ax.add_patch(ellipse) # 关键!设置坐标轴等比例,避免椭圆变形 ax.set_aspect('equal', adjustable='box') # 添加标签和标题 ax.set_xlabel('X 坐标(东西向)') ax.set_ylabel('Y 坐标(南北向)') ax.set_title('地理单元坐标与椭圆分布') plt.show()
关键细节说明
- zorder参数:让散点的层级(zorder=2)高于椭圆(zorder=1),确保散点不会被椭圆遮挡
- set_aspect('equal'):强制坐标轴比例一致,保证椭圆的南北/东西直径比例和真实数据匹配,不会出现拉伸变形
- 椭圆样式自定义:可以修改
edgecolor(边框颜色)、linewidth(边框宽度)、facecolor(填充颜色,带透明度的话用RGBA格式,比如#33b5e580)来调整外观
如果不用Pandas(纯列表数据)
要是你没用Pandas,直接用列表存储数据,代码可以改成这样:
import matplotlib.pyplot as plt from matplotlib.patches import Ellipse # 替换成你的真实数据 X = [1, 3, 5, 2] Y = [2, 4, 1, 3] 南北直径 = [0.8, 1.2, 0.6, 1.0] 东西直径 = [1.5, 2.0, 1.0, 1.8] fig, ax = plt.subplots(figsize=(8, 6)) ax.scatter(X, Y, color='#ff4444', s=50, zorder=2) # 遍历所有点绘制椭圆 for x, y, ns_diam, ew_diam in zip(X, Y, 南北直径, 东西直径): ellipse = Ellipse( xy=(x, y), width=ew_diam, height=ns_diam, edgecolor='#33b5e5', facecolor='none', linewidth=1.5, zorder=1 ) ax.add_patch(ellipse) ax.set_aspect('equal') ax.set_xlabel('X 坐标(东西向)') ax.set_ylabel('Y 坐标(南北向)') plt.show()
内容的提问来源于stack exchange,提问作者antecessor
相关产品推荐
相关产品推荐

