我有一个连续的比例,包括一些编码不同类别的缺失的值(例如998,999
),我想制作一个不包括这些数字缺失值的图。
由于这些值在一起,我每次都可以使用xlim
,但由于它确定了图的域,我必须更改每个不同情况的值。
然后,我要求解决方案。我认为有两种可能性。
xlim
所示。xlim
?相反的功能,这意味着由限制(或给定的一组离散值)确定的范围将不包含在x轴中。提前致谢。
答案 0 :(得分:2)
我认为最简单的方法是在ggplot调用之前或期间在图中排除这些值。
library(tidyverse)
# Create data with overflowing data
mtcars2 <- mtcars
mtcars2[5:15, 'mpg'] <- 998
# Full plot
mtcars2 %>% ggplot() +
geom_point(aes(x = mpg, y = disp))
mtcars2 %>%
filter(mpg < 250) %>%
ggplot() +
geom_point(aes(x = mpg, y = disp))
mtcars2 %>%
ggplot() +
geom_point(aes(x = mpg, y = disp), data = . %>% filter(mpg < 250))
答案 1 :(得分:0)
我会从原始数据集中过滤掉那些缺失值:
library(dplyr)
df <- data.frame(cat = rep(LETTERS[1:4], 3),
values = sample(10, 12, replace = TRUE)
)
# Add missing values
df$values[c(1,5,10)] <- 999
df$values[c(2,7)] <- 998
invalid_values <- c(998, 999)
library(ggplot2)
df %>%
filter(!values %in% invalid_values) %>%
ggplot() +
geom_point(aes(cat, values))
或者,如果由于某种原因无法实现,您可以定义比例转换:
df %>%
ggplot() +
geom_point(aes(cat, values)) +
scale_y_continuous(trans = scales::trans_new('remove_invalid',
transform = function(d) {d <- if_else(d %in% invalid_values, NA_real_, d)},
inverse = function(d) {if_else(is.na(d), 999, d)}
)
)
#> Warning: Transformation introduced infinite values in continuous y-axis
#> Warning: Removed 5 rows containing missing values (geom_point).
由reprex package(v0.2.0)创建于2018-05-09。