【问题标题】:Issue while creating cartogram plot in r在 r 中创建制图时出现问题
【发布时间】:2021-05-17 22:35:37
【问题描述】:

我是 Spatial datacartogram lib 的新手,在尝试从以下位置重新创建情节时遇到了一些问题:https://www.r-graph-gallery.com/a-smooth-transition-between-chloropleth-and-cartogram.html

库和数据

library(tidyverse)
library(maptools)
library(cartogram)
library(viridis)
library(sf)

data("wrld_simpl")

afr_cartogram = wrld_simpl[wrld_simpl$REGION==2,]

在此之后,我遇到了一些错误:比如st_transform ..... 我在使用sf lib 进行了一些谷歌搜索后修复了它。

afr_sf <- st_as_sf(afr_cartogram)

afr_sf_proj = st_transform(afr_sf,3857)

afr_plot <- cartogram::cartogram(afr_sf_proj, "POP2005", itermax =7)

问题:现在在这一步之后,我无法重新创建代码,因为它在 演示网站中,因为我 没有列 group我的数据

ggplot() +
  geom_polygon(data = afr_plot, aes(fill = POP2005/1000000, x = LON, y = LAT, group = group) , size=0, alpha=0.9) +
  theme_void()

从哪里可以得到group 专栏???

网站使用的代码:

data(wrld_simpl)
afr=wrld_simpl[wrld_simpl$REGION==2,]

afr_cartogram <- cartogram(afr, "POP2005", itermax=7)

# Transform these 2 objects in dataframe, plotable with ggplot2
afr_cartogram_df <- tidy(afr_cartogram) %>% left_join(. , afr_cartogram@data, by=c("id"="ISO3")) 
afr_df <- tidy(afr) %>% left_join(. , afr@data, by=c("id"="ISO3")) 
 
# And using the advices of chart #331 we can custom it to get a better result:
ggplot() +
  geom_polygon(data = afr_df, aes(fill = POP2005/1000000, x = long, y = lat, group = group) , size=0, alpha=0.9) +
  theme_void() +
  scale_fill_viridis(name="Population (M)", breaks=c(1,50,100, 140), guide = guide_legend( keyheight = unit(3, units = "mm"), keywidth=unit(12, units = "mm"), label.position = "bottom", title.position = 'top', nrow=1)) +
  labs( title = "Africa", subtitle="Population per country in 2005" ) +
  ylim(-35,35) +
  theme(
    text = element_text(color = "#22211d"), 
    plot.background = element_rect(fill = "#f5f5f4", color = NA), 
    panel.background = element_rect(fill = "#f5f5f4", color = NA), 
    legend.background = element_rect(fill = "#f5f5f4", color = NA),
    plot.title = element_text(size= 22, hjust=0.5, color = "#4e4d47", margin = margin(b = -0.1, t = 0.4, l = 2, unit = "cm")),
    plot.subtitle = element_text(size= 13, hjust=0.5, color = "#4e4d47", margin = margin(b = -0.1, t = 0.4, l = 2, unit = "cm")),
    legend.position = c(0.2, 0.26)
  ) +
  coord_map()

【问题讨论】:

    标签: r ggplot2 sf cartogram


    【解决方案1】:

    group 列在这些行中生成

    afr_cartogram_df <- tidy(afr_cartogram) %>% 
       left_join(afr_cartogram@data, by = ("id" = "ISO3")) 
    afr_df <- tidy(afr) %>% 
       left_join(afr@data, by = c("id" = "ISO3"))
    

    通过 broom 包中的 tidy 函数,该函数未附加在您的代码中!

    使用library(broom) 附加broom 或从其命名空间调用tidy(),如下所示:broom::tidy(...)

    代码中的“数据部分”应如下所示:

    data(wrld_simpl)
    afr <- wrld_simpl[wrld_simpl$REGION==2, ]
    afr_cartogram <- wrld_simpl[wrld_simpl$REGION == 2,]
    afr_sf <- st_as_sf(afr_cartogram)
    afr_sf_proj <- st_transform(afr_sf,  3857)
    afr_plot <- cartogram_cont(afr_sf_proj, "POP2005", itermax =7)
    
    afr_cartogram_df <- broom::tidy(afr_cartogram) %>% 
      left_join(afr_cartogram@data, by=c("id" = "ISO3")) 
    afr_df <- broom::tidy(afr) %>% 
      left_join(afr@data, by=c("id" = "ISO3")) 
    

    随后的ggplot 代码可以正常工作:

    【讨论】:

    • 嗨,由于您的回答给出了更好的解释,我删除了我的并在此处添加了代码。如果您不想将其放入,请随时将其取出。
    • 感谢@slamballais 帮助我解决这个问题。感谢您的帮助:)
    • 感谢@Martin C. Arnold 帮助我解决这个问题。感谢您的帮助:)
    • @slamballais 感谢您的建议,我只是添加了几行和 ggplot 输出(:
    • 嗨@MartinC.Arnold 我在这里有点困惑,因为你指的是afr,就像在你的代码中使用的afr_df &lt;- tidy(afr) %&gt;% 。正如您使用了afr_cartogram &lt;- wrld_simpl[wrld_simpl$REGION == 2,],但我在这些行中的任何地方都没有看到对象afr 创建,但它们稍后在代码中被调用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-16
    • 1970-01-01
    • 1970-01-01
    • 2022-01-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多