【问题标题】:Labeling a US States map标记美国各州地图
【发布时间】:2021-08-20 20:51:54
【问题描述】:

我在 R 中制作了一张地图,想知道如何适当地标记州代码(我的数据集中的变量)。使用简单的 geom_text 甚至 geom_text_repel 我得到了每个州的很多标签(我实际上可以理解为什么),正如我继续展示的那样:

Map

我该如何解决它,以便每个州获得 1 个且只有 1 个文本缩写(这些州代码在我的数据集中作为变量命名为 State Codes)?提前致谢。

代码如下:

library(tidyverse)
library(maps)
library(wesanderson)
library(hrbrthemes)

ggplot(data = data, 
       mapping = aes(x = long, 
                     y = lat, 
                     group = group, 
                     fill = black_percentage)) +
  geom_polygon(col = "black") +
  geom_text(aes(label = black_percentage)) +
  theme_void() +
  theme(legend.position = "bottom",
        legend.title = element_blank(),
        plot.title = element_text(hjust = 0.5, family = "Times", face = "bold"),
        plot.subtitle = element_text(hjust = 0.5, family = "Times", face = "italic"),
        plot.caption = element_text(family = "Times", face = "italic"),
        legend.key.height = unit(0.85, "cm"),
        legend.key.width = unit(0.85, "cm")) +
  scale_fill_gradient(low = "#E6A0C4", 
                       high = "#7294D4") +
  labs(title = "Percentage of Black People, US States 2018",
       subtitle = "Pink colors represent lower percentages. Light-blue colors represents higer percentages") +
  ggsave("failed_map.png")

【问题讨论】:

  • 我在这里有点搞砸了,我说我想要将变量标记为“black_percentage”而不是“State Codes”,但这张地图仅用于演示目的。正确标记后仍然无法正常工作。
  • 你能提供/一些示例数据吗?

标签: r dictionary ggplot2


【解决方案1】:

你能提供/一些示例数据吗?

多个标签的一个可能原因是每个状态在数据中有多个行,因此ggplot 认为它需要绘制多个标签。如果您只需要一个标签,一个解决方案是创建一个单独的汇总数据集,每个状态/标签只有一行。然后将此摘要数据提供给geom_text(),而不是原始数据。尽管在这种情况下不是问题,但这是解决“模糊”标签的常见问题的方法;当 10 个或 100 个标签相互重叠打印时,它们看起来很模糊,但当打印一个标签时,它看起来很好。

查看您的代码和映射美学,看起来geom_text() 正在从第一行ggplot() 继承xy 美学。因此geom_text() 将为每个状态的xylonglat)的每个值创建一个标签。这也解释了为什么所有标签看起来都遵循州边界。

我建议您将每个状态汇总为一个(xy)坐标(例如状态的中间),并将其提供给geom_text()。同样,如果没有一些示例数据,可能很难解释,但类似:

# make the summary label dataframe
state_labels <- your_data %>%
   group_by(state) %>%
   summarise(
      long = mean(long), 
      lat = mean(lat), 
      mean_black = mean(black_percentage)
   )


# then we plot it
ggplot(data = data, 
       mapping = aes(x = long, 
                     y = lat, 
                     group = group, 
                     fill = black_percentage)) +
  geom_polygon(col = "black") +
  geom_text(data = state_labels, aes(label = mean_black))

由于xy 坐标的名称在您的data 和我们所做的新state_labels 摘要(longlat)中相同,geom_text() 将“继承” (假设/使用)您在ggplot() 的第一行中提供的相同xy 美学。这很方便,但如果任一数据集具有不同/相同的列名,或者您想要分配不同的美学,有时可能会让您感到悲伤。例如,您不需要geom_text() 来继承fill = black_percentage 美学(尽管在这种情况下我认为这不会导致问题,因为geom_text() 不接受fill 美学)。要禁用美学继承,只需将inherit.aes = FALSE 提供给geom。在这种情况下,它看起来像这样,请注意我们现在如何为 geom_text() 提供 xy 美学。

ggplot(data = data, 
       mapping = aes(x = long, 
                     y = lat, 
                     group = group, 
                     fill = black_percentage)) +
  geom_polygon(col = "black") +
  geom_text(data = state_labels, aes(x = long, y = lat, label = mean_black), inherit.aes = FALSE)

编辑 如果您需要单个标签,但标签不是数值,并且您无法使用mean 或类似方法计算汇总统计量,则适用相同原则;您想要创建数据的汇总版本,每个州都有一个坐标和一个标签 - 每个州有 1 行。有很多方法可以做到这一点,但我的首选是 dplyr::first 或类似的。

# make the summary label dataframe
state_labels <- your_data %>%
   group_by(state) %>%
   summarise(
      long = mean(long), 
      lat = mean(lat), 
      my_label = first(`State Codes`)
   )



# then we plot it
ggplot(data = data, 
       mapping = aes(x = long, 
                     y = lat, 
                     group = group, 
                     fill = black_percentage)) +
  geom_polygon(col = "black") +
  geom_text(data = state_labels, aes(label = my_label))

最后,ggplot 有几个内置函数来绘制和映射空间数据。在可能的情况下使用这些是个好主意,因为它会让你的生活更轻松。可以在 here 找到一个很棒的 3 部分教程,它甚至包含一个您正在尝试做什么的示例。

【讨论】:

  • 这正是我的意思,这就是为什么我说我实际上可以理解为什么我得到多个标签。创建地图时,州(在这种情况下,但无论您要绘制什么)都会获得多个纬度和经度数字。非常感谢代码和响应者,会尽快检查。并感谢您的教程,会看到它。
  • 实际上,对不起,我试图标记州的缩写,而不是州的黑人百分比。我认为这会改变整个观点,不是吗?那么,我实际上不知道该怎么做,因为与百分比相反,我无法计算平均值。那么我们该如何进行呢?哈。提前致谢。
  • 更新了答案,希望对您有所帮助
  • 工作得很好;)。现在标签位置有问题,哈。谢谢大佬,不胜感激。
  • 太棒了。您可以使用geom_text(hjust = c(...), vjust = c(....)) 调整各个标签位置。您可以向hjustvjust 提供一个数字以将所有标签调整为相同,或者提供一个值向量,为每个标签指定单独的调整。如果您也能接受答案,我们将不胜感激:)
猜你喜欢
  • 2011-07-29
  • 1970-01-01
  • 1970-01-01
  • 2016-03-23
  • 2011-08-09
  • 2021-08-22
  • 2023-03-27
  • 1970-01-01
  • 2018-07-31
相关资源
最近更新 更多