【问题标题】:Scatter plot with lat long points with respect to a given point at the center of the plot相对于绘图中心给定点的经纬度散点图
【发布时间】:2020-06-10 18:59:32
【问题描述】:

我正在尝试使用 R 中的 ggplot2 在绘图上绘制经纬度点。轴在 y 上是纬度,在 x 上是长期。我希望给定的位置点成为我的绘图的中心,而散点图上的其余点相对于它们与该点的距离(这些点的经纬度值来自数据框)。 那个特定的点怎么会是这一切的中心呢?我尝试制作两个单独的 geom_point 图层,并首先在中心添加一个我想要的点,然后将第二个 geom 图层与其余数据一起添加。但它不起作用。当我只在绘图上绘制主要中心点时,我还尝试使用第一个 geom 层的 lat long 限制来尝试 coord_fixed,但是在添加第二层后,它不会保留在中心。我也想知道为什么没有函数或属性可以围绕特定点设置图的中心,以便其余点可以落在图上的任何位置,但焦点就在我想要的地方,但也许它也是具体的一件事。 另外,坐标轴上的单位可以换算成米吗?

【问题讨论】:

  • 您能否发布一个带有dput 和minimal reproducible example 的数据示例。一般来说,听起来你必须在使用ggplot 绘图之前进行数据预处理
  • 您好@starja,我粘贴我data.frame对象的dput输出:结构(列表(纬度= C(38.55042047,38.47350069,38.65784584,38.50677377,38.6374478,38.52697863,38.537173,38.56433456,38.6374478 ,38.60960217),经度= C(-121.3914158,-121.4901858,-121.4621009,-121.426125,-121.4513383,-121.487574,-121.46125,-121.4618826,-121.3846125,-121.3846125,-121.4918375,-121.4918375),Row.names = C(NA,10L) , class= "data.frame")。这些是我的中心点的坐标:x=-121.4282497, y=38.4138742。

标签: r ggplot2 latitude-longitude scatter-plot geom


【解决方案1】:

最简单的方法是确定您想要的 x 轴范围以及您想要的 y 轴范围。测量沿 x 轴到距目标点最远点的距离,并确保 x 轴范围在两侧都这么大。对 y 轴执行相同操作。

为了演示,我将随机抽取具有 x 和 y 坐标的点,每个点都变小并变黑:

set.seed(1234) # Makes this example reproducible

df <- data.frame(x = rnorm(200), y = rnorm(200), colour = "black", size = 1)

现在我会随机选择一个作为我的目标点,让它变大变红:

point_of_interest            <- sample(200, 1)
df$colour[point_of_interest] <- "red"
df$size[point_of_interest]   <- 5

因此,让我们计算距离目标最远的南北和东西点,并计算一个包含所有点但目标位于中心的范围:

max_x_diff <- max(abs(df$x[point_of_interest] - df$x))
max_y_diff <- max(abs(df$y[point_of_interest] - df$y))
x_range    <- df$x[point_of_interest] + c(-max_x_diff, max_x_diff)
y_range    <- df$y[point_of_interest] + c(-max_y_diff, max_y_diff)

现在我们只需要绘制:

ggplot(df, aes(x, y, colour = colour, size = size)) +
  geom_point() +
  scale_colour_identity() +
  lims(x = x_range, y = y_range) +
  scale_size_identity() +
  coord_equal()

我们可以看到,即使我们的目标远离集群的中心,目标仍然在图的中心。

关于将纬度和经度更改为米,这需要坐标转换。这已经在 Stack Overflow 上回答了很多次,我不会在这里重复这些答案。您可以查看 rgdal 或 SpatialEpi 等具有 latlong2grid 功能的软件包。

【讨论】:

  • 谢谢@allan-cameron,但是,我坚持做'point_of_interest'。首先,当我尝试我的代码时(在提出这个问题之前),我通过 geom_point(aes(x=..., y=...), colour="red", size=5) 手动给出了这一点因为它不在数据框中。但是,即使我将这个值复制到导出这个 df 的 csv 中,我如何从两个不同的列中提取两个单元格值作为一个 point_of_interest 以在中心绘制?
  • @stackuser 如果您的数据框名为df 并且您有一个名为longitude 的列加上另一个名为latitude 的列,您只需找到包含坐标的df 行。假设兴趣点在您的第一行。然后df$longitude[1] 得到 x 值,df$latitude[1] 得到 y 值。
  • 我做了那部分,但是当我尝试为这些 x 和 y 值分配颜色和大小时出现错误。 “$&lt;-.data.frame(*tmp*, colour, value = character(0)) 中的错误:替换有 0 行,数据有 300”
  • 假设您上面的数据框名为df。然后你必须用df$colour &lt;- "black"和df$size &lt;- 1添加列的颜色和大小,你可以用df &lt;- rbind(df, data.frame(latitude = 38.4138742, longitude = -121.4282497, colour = "red", size = 5))添加你的兴趣点
猜你喜欢
  • 1970-01-01
  • 2012-04-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多