有没有办法操纵ggplot刻度和标签?

And*_*rie 30 r ggplot2

ggplot 通常可以很好地在尺度上创造合理的断裂和标签.

但是,我发现在具有许多方面和可能是formatter=声明的情节中,标签往往过于"密集"和套印,例如在这张图片中:

df <- data.frame(
        fac=rep(LETTERS[1:10], 100),
        x=rnorm(1000)
)

ggplot(df, aes(x=x)) + 
  geom_bar(binwidth=0.5) + 
  facet_grid(~fac) + 
  scale_x_continuous(formatter="percent")
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

我知道我可以通过提供breaks=scale=参数来明确指定刻度的中断和标签scale_x_continuous.

但是,我正在处理包含许多问题和十几个交叉测试的调查数据,因此需要找到一种自动执行此操作的方法.

有没有办法告诉ggplot自动计算断点和标签,但只有更少,比如最小,最大和零点?

编辑:理想情况下,我不想指定最小和最大点,但不知何故利用内置的ggplot刻度训练,并使用默认计算的比例限制.

Cha*_*ase 26

您可以传入诸如min()max()调用ggplot之类的参数来动态指定中断.听起来您将在各种各样的数据中应用它,因此您可能需要考虑将其概括为函数并弄乱格式,但这种方法应该有效:

ggplot(df, aes(x=x)) + 
  geom_bar(binwidth=0.5) + 
  facet_grid(~fac) + 
  scale_x_continuous(breaks = c(min(df$x), 0, max(df$x))
    , labels = c(paste( 100 * round(min(df$x),2), "%", sep = ""), paste(0, "%", sep = ""), paste( 100 * round(max(df$x),2), "%", sep = ""))
    )
Run Code Online (Sandbox Code Playgroud)

或旋转x轴文本opts(axis.text.x = theme_text(angle = 90, hjust = 0))以产生如下内容:

在此输入图像描述

更新

在最新版本的GGPLOT2breakslabels参数scale_x_continuous接受功能,所以可以做类似如下:

myBreaks <- function(x){
    breaks <- c(min(x),median(x),max(x))
    names(breaks) <- attr(breaks,"labels")
    breaks
}

ggplot(df, aes(x=x)) + 
  geom_bar(binwidth=0.5) + 
  facet_grid(~fac) + 
  scale_x_continuous(breaks = myBreaks,labels = percent_format()) + 
  opts(axis.text.x = theme_text(angle = 90, hjust = 1,size = 5))
Run Code Online (Sandbox Code Playgroud)

  • @Andrie也许你可以提供一组更新的样本数据来更好地说明你的问题?据我所知,你至少有两个不同的问题.1.刻度轴的过度绘图,2.使用相同的代码块在不同的灯光下显示相同的数据.你可以用`... + opts(axis.text.x = theme_text(angle = 90,hjust = 0))`来解决过度绘图问题.如果你想超越格式问题,我认为你将不得不编写自己的函数来将参数传递给`labels()`和`breaks()`. (3认同)

Tim*_*man 5

scales包包含几个breaks_*label_*函数,它们返回 ggplot 使用的函数(闭包)。因此,您可以为这些内容编写一个包装器来修改输出。

例如:

library(ggplot2)

# Compute the list of breaks using original_func,
# then remove any of these that occur in remove_list
remove_breaks <- function(original_func, remove_list = list()) {
  function(x) {
    original_result <- original_func(x)
    original_result[!(original_result %in% remove_list)]
  }
}

# Compute the list of labels using original_func,
# then remove any of these that occur in remove_list
remove_labels <- function(original_func, remove_list = list()) {
  function(x) {
    original_result <- original_func(x)
    replace(original_result, original_result %in% remove_list, '')
  }
}

# Original plot
ggplot(data.frame(x=c(1,2,3,4,5,6,7,8), y = c(1,4,9,16,25,36,49,64))) + geom_line(aes(x, y)) +
  scale_x_continuous(breaks       = scales::breaks_pretty(9),
                     minor_breaks = scales::breaks_pretty(18),
                     labels       = scales::label_number_auto()) +
  scale_y_continuous(breaks       = scales::breaks_pretty(9),
                     minor_breaks = scales::breaks_pretty(18),
                     labels       = scales::label_number_auto())

# Remove some breaks from the x-axis, and remove some labels from the y-axis
ggplot(data.frame(x=c(1,2,3,4,5,6,7,8), y = c(1,4,9,16,25,36,49,64))) + geom_line(aes(x, y)) +
  scale_x_continuous(breaks       = remove_breaks(scales::breaks_pretty(9), seq(3,6)),
                     minor_breaks = remove_breaks(scales::breaks_pretty(18), seq(3,6,0.5)),
                     labels       = scales::label_number_auto()) +
  scale_y_continuous(breaks       = scales::breaks_pretty(9),
                     minor_breaks = scales::breaks_pretty(18),
                     labels       = remove_labels(scales::label_number_auto(), seq(20, 30)))
Run Code Online (Sandbox Code Playgroud)

当然,使用我的 simpleremove_breaksremove_labels函数,您仍然需要指定要删除的值,但是您可以轻松地将它们修改为删除最大值和最小值、删除指定范围内的任何值等。