R语言 如何使用ggplot2进行子集化而不删除形状?

7fhtutme  于 2023-02-06  发布在  其他
关注(0)|答案(1)|浏览(120)

大家好,我正在使用ggplot2创建我的国家的地理表示,这是我使用的数据集和脚本(* prov2022 * 是Map的shapefile)

#database
COD_REG   COD_PROV   Wage
1         91         530
1         92         520
1         93         410
2         97         300
2         98         205
2         99         501
13        102        700
13        103        800   
13        159        900
18        162        740
18        123        590   
18        119        420
19        162        340
19        123        290   
19        119        120
#script
right_join(prov2022, database, by = "COD_PROV") %>% 
  ggplot(aes(fill = `Wage`))+
  geom_sf(data = ~ subset(., `Wage` > 300 & `Wage` <= 800)) +
  theme_void() +
  theme(legend.title=element_blank())+
  scale_fill_gradientn(colors = c( 'white', 'yellow' , 'red', 'black')) +
  geom_blank()

它运行良好,但我对可视化我用命令 * subset * 排除的区域的形状也很感兴趣。我的目的是用颜色渐变只填充Wage〉300和Wage〈= 800的区域,但设置 * geom_sf(data =~subset(.,Wage〉300 & Wage〈= 800))* 我已经从我的Map中完全删除了不满足这个条件的部分。实际上,我需要在输出中包含它们,但不填充它们(只填充它们的形状)。
我怎么解决?

    • 关于脚本的更新**这是我在@r2evans的建议后使用的
right_join(prov2022, database, by = "COD_PROV") %>% 
  ggplot(aes(fill = `Importo medio mensile`))+
  geom_sf(data = ~ transform(., `Importo medio mensile` = ifelse(`Importo medio mensile` > 1500 & `Importo medio mensile` <= 1700, `Importo medio mensile`[NA], `Importo medio mensile`))) + 
  theme_void() +
  theme(legend.title=element_blank())+
  scale_fill_gradientn(colors = c( 'white', 'yellow', 'red', 'black'), na.value = "#00000000") +
  geom_blank()

但答案是

Error in FUN(X[[i]], ...) : object 'Importo medio mensile' not found
    • 更新第2部分**

如果我想使用另一个变量 * Salario reale * 填充,但我想保持使用前一个变量 * Importo medio mensile * 的值所做的区域选择,我应该怎么做?
仅替换fill变量无效

right_join(prov2022, database, by = "COD_PROV") %>% 
  ggplot(aes(fill = `Salario Reale`))+
  geom_sf(data = ~ dplyr::mutate(., `Importo medio mensile` = ifelse(`Importo medio mensile` > 1500 & `Importo medio mensile` <= 1700, `Importo medio mensile`, `Importo medio mensile`[NA]))) + 
  theme_void() +
  theme(legend.title=element_blank())+
  scale_fill_gradientn(colors = c( 'white', 'yellow', 'red', 'black'), na.value = "#00000000") +
  geom_blank()

它会将我所在国家的所有区域都着色,就好像我想要维护的子集(变量为Importo medio mensile的子集)不存在一样。

    • 更新3**r2evans提出的解决方案有效!!
mkshixfv

mkshixfv1#

不用过滤数据,只需用NA替换(可选内联)不着色的值。
继续我的previous answer

ggplot(usa, aes(fill = val)) +
  geom_sf(data = ~ transform(., val = ifelse(val < 0.5, val[NA], val))) + 
  scale_fill_gradientn(colors = c( 'white', 'yellow', 'red', 'black')) + 
  geom_blank()

(The使用val[NA]是为了确保我们拥有NA的一个特定类,因为NA至少有6种不同的 * 类型 *。)
当然,灰色可能不是您想要的,所以您可以使用na.value=(它的默认值是na.value="grey50")来解决这个问题。

ggplot(usa, aes(fill = val)) +
  geom_sf(data = ~ transform(., val = ifelse(val < 0.5, val[NA], val))) + 
  scale_fill_gradientn(colors = c( 'white', 'yellow', 'red', 'black'), 
                       na.value = "#00000000") + 
  geom_blank()

其中#00000000是完全透明的颜色。前六个0无关紧要,后面两个00表示alpha为0(透明)。
我 * 认为 * 这意味着你想要这样的东西:

right_join(prov2022, database, by = "COD_PROV") %>% 
  ggplot(aes(fill = `Importo medio mensile`))+
  geom_sf(data = ~ mutate(., `Importo medio mensile` = ifelse(`Importo medio mensile` > 300 & `Importo medio mensile` <= 800, `Importo medio mensile`, `Importo medio mensile`[NA]))) +
  theme_void() +
  theme(legend.title=element_blank())+
  scale_fill_gradientn(colors = c( 'white', 'yellow' , 'red', 'black')) +
  geom_blank()

注:

  • 我将示例中的Wage更新为您在评论中提到的Importo medio mensile;
  • 我上面的代码使用了transform,它是以R为基础的,一般来说可以正常工作,* 除了 * 当使用的名称是"非常规R名称"时,在这种情况下,它倾向于在名称中添加. s。使用dplyr::mutate解决了这个问题。您已经在使用right_join,所以我认为我没有添加任何依赖项。

换个Angular 来看:data = ~ mutate(...)只在内部更改数据,因此原始数据不受影响。可以很容易地执行类似的操作以获得相同的效果。

right_join(prov2022, database, by = "COD_PROV") %>% 
  mutate(SOMETHING = ifelse(`Importo medio mensile` > 300 & `Importo medio mensile` <= 800, `Importo medio mensile`, `Importo medio mensile`[NA])) %>%
  ggplot(aes(fill = SOMETHING)) +
  geom_sf() +
  theme_void() +
  theme(legend.title=element_blank())+
  scale_fill_gradientn(colors = c( 'white', 'yellow' , 'red', 'black')) +
  geom_blank(aes(fill = `Importo medio mensile`))

注意,我们需要在空白几何中重新定义fill=,以便由ggplot处理正确的值范围。

相关问题