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

如何用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 06:47:43