大家好,我正在使用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提出的解决方案有效!!
1条答案
按热度按时间mkshixfv1#
不用过滤数据,只需用
NA
替换(可选内联)不着色的值。继续我的previous answer,
(The使用
val[NA]
是为了确保我们拥有NA
的一个特定类,因为NA
至少有6种不同的 * 类型 *。)当然,灰色可能不是您想要的,所以您可以使用
na.value=
(它的默认值是na.value="grey50"
)来解决这个问题。其中
#00000000
是完全透明的颜色。前六个0
无关紧要,后面两个00
表示alpha为0(透明)。我 * 认为 * 这意味着你想要这样的东西:
注:
Wage
更新为您在评论中提到的Importo medio mensile
;transform
,它是以R为基础的,一般来说可以正常工作,* 除了 * 当使用的名称是"非常规R名称"时,在这种情况下,它倾向于在名称中添加.
s。使用dplyr::mutate
解决了这个问题。您已经在使用right_join
,所以我认为我没有添加任何依赖项。换个Angular 来看:
data = ~ mutate(...)
只在内部更改数据,因此原始数据不受影响。可以很容易地执行类似的操作以获得相同的效果。注意,我们需要在空白几何中重新定义
fill=
,以便由ggplot处理正确的值范围。