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")
我知道我可以通过向breaks=
提供scale=
和scale_x_continuous
个参数来明确指定刻度的中断和标签。
但是,我正在处理包含许多问题和十几个交叉项的调查数据,因此需要找到一种自动执行此操作的方法。
有没有办法告诉ggplot
自动计算中断和标签,但只有少量,比如最小,最大和零点?
编辑:理想情况下,我不想指定最小和最大点,但不知何故使用内置的ggplot刻度训练,并使用默认计算的比例限制。
答案 0 :(得分:25)
您可以在调用ggplot时传递min()
和max()
等参数,以动态指定中断。听起来你将要在各种各样的数据中应用它,所以你可能要考虑将它概括为函数并弄乱格式化,但这种方法应该有效:
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 = ""))
)
或用opts(axis.text.x = theme_text(angle = 90, hjust = 0))
旋转x轴文字以产生类似:
<强>更新强>
在 ggplot2 的最新版本中,breaks
的{{1}}和labels
参数接受函数,因此可以执行以下操作:
scale_x_continuous
答案 1 :(得分:1)
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)))
当然,通过我简单的remove_breaks
和remove_labels
函数,您仍然必须指定要删除的值,但是您可以轻松地将其修改为删除最大值和最小值,删除任何值的值。在指定范围内,等等。