如何创建如下图所示的马赛克图

问题描述

我几天来一直在尝试使用土地覆盖数据创建马赛克图,但我无法弄清楚,我正在使用这些数据:

enter image description here

我想创建这样的东西:

enter image description here

提前致谢!

扎克

解决方法

更新: 这是代码:您可以通过 facet_wrapyear 或不:

library(tidyverse)

# data
df <- tibble::tribble(
~A,~B,~C,~D,~E,"LC",2002,2004,2006,2008,"class1",27.05,25.35,13.35,21.35,"class2",60.2,42.5,53.05,72.95,"class3",33.45,59.75,49.2,62,"class4",198.15,168.1,193.95,136.55,"class5",48.55,65.3,54.65,10.35,"class6",59.6,37,44.7,94.75
  )

# wrangle dataframe
df1 <- df %>% 
  rename("LC" = "A",`2002` = B,`2004` = C,`2006` = D,`2008` = E) %>%          # rename colnames
  slice(-1) %>%                               # remove first row
  mutate(id = row_number()) %>%               # create id
  pivot_longer(
    cols = c(-id,-LC),names_to = "year",values_to = "value"
  ) %>%                                       # bring into long format
  mutate(LC = as.factor(LC),year = as.factor(year)
         )                                    # transform to factor



#  calculate the respective xmin,xmax,ymin and ymax of the by grouping by LC and year
df_mosaic <- df1 %>% group_by(LC) %>%
  mutate(
    share = value / sum(value),tot_group = sum(value)
  ) %>% 
  ungroup()

df_mosaic1 <- df_mosaic %>%
  group_by(year) %>%
  arrange(desc(LC)) %>%
  mutate(
    ymax = cumsum(tot_group) / sum(tot_group),ymin = (ymax - (tot_group/sum(tot_group)))
  ) %>% ungroup() %>%
  group_by(LC) %>%
  arrange(desc(year)) %>%
  mutate(xmax = cumsum(share),xmin = xmax - share) %>%
  ungroup() %>%
  arrange(year)

# labels
labels <- df_mosaic1 %>%
  filter(year == "2008") %>%
  mutate(y = ymax - 0.01,yRange = (ymax - ymin)* 100) %>%
  select(LC,y,yRange) %>%
  ungroup()

value_labels <- df_mosaic1 %>%
  select(LC,year,xmin,ymax,share) %>%
  mutate(
    x = ifelse(year == "2008",xmin),y = ymax - 0.005,label = paste0(round(share * 100),"%"),hjust = ifelse(year == "2008",1.05,-0.25)
  )

# mosaic plot
ggplot(df_mosaic1) +
  geom_rect(aes(ymin = ymin,ymax = ymax,xmin = xmin,xmax = xmax,fill = year),colour = "white",size = 0.2)+
  scale_fill_manual("legend",values = c("2002" = "blue","2004" = "red","2006" = "grey","2008"="brown"))+
  theme_light()+
  geom_text(
    data = labels,aes(x = 1.05,y = y,label = as.character(LC)),hjust = 0,vjust = 1,colour = "blue",size=3
  ) +
  geom_text(
    data = value_labels,aes(x = x,label = label,hjust = hjust),size = 3,alpha = 1,colour = "white"
  ) +
  scale_y_continuous( breaks = labels$y,limits = c(0,1),labels = scales::percent)+
  facet_wrap(~ year) +
  theme_minimal()+
  theme(axis.title=element_blank(),plot.title = element_text(hjust = 0.5))+
  ggtitle("Values by Year and Class")

enter image description here

第一个答案: 我可以提供这种马赛克图的代码。这与您的示例不同。 请告诉我这是否可以帮助您: enter image description here