如何用ggplot预留x的某些数值?

时间:2018-05-09 09:02:39

标签: r plot ggplot2

我有一个连续的比例,包括一些编码不同类别的缺失的值(例如998,999),我想制作一个不包括这些数字缺失值的图。

由于这些值在一起,我每次都可以使用xlim,但由于它确定了图的域,我必须更改每个不同情况的值。

然后,我要求解决方案。我认为有两种可能性。

  • 是否可以对x值设置非确定限制?我的意思是,如果我将990作为最大限制,但显示的最大值为100,则该图应显示x范围,直到大约100,而不是990,如xlim所示。
  • 是否存在与xlim?相反的功能,这意味着由限制(或给定的一组离散值)确定的范围将不包含在x轴中。

提前致谢。

2 个答案:

答案 0 :(得分:2)

我认为最简单的方法是在ggplot调用之前或期间在图中排除这些值。

MWE

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。