ggplot2 Tufte 线与轴刻度相同
ggplot2 Tufte lines same as axis ticks
多年来我一直在使用 Tufte 线和 ggplot2,但我一直想知道是否有一种自动绘制它们的方法,所以它们对应于轴抽动。
我通常画它们的方式是这样的:
ggplot(mtcars, aes(x=mpg, y=cyl))+
geom_bar(stat = "identity")+
theme_tufte()+
geom_hline(yintercept = c(5,10,15), col="white", lwd=3)
这里我用 yintercept = c(5,10,15) 指定刻度,但最近我正在构建一个带有变化轴的 Shiny 应用程序,所以我不能指定固定刻度。
有没有办法让我说类似 yintercept = tickmarks 的东西,这样我的 Shiny 应用程序就可以一直运行,而无需手动预先计算和定义轴和 Tufte 线?
您可以使用 ggplot_build
将刻度线位置提取为向量,然后将其传递给 geom_hline
的 yintercept
参数:
p <- ggplot(mtcars, aes(x=mpg, y=cyl))+
geom_bar(stat = "identity")+
theme_tufte()
tickmarks <- ggplot_build(p)$layout$panel_ranges[[1]]$y.major_source
p + geom_hline(yintercept = tickmarks, col="white", lwd=3)
这是一个计算中断位置的函数,然后将它们应用于 scale_y_continuous
和 geom_hline
:
library(ggthemes)
library(scales)
library(lazyeval)
library(tidyverse)
fnc = function(data, x, y, nbreaks=5, lwd=3, breaks=NULL) {
if(is.null(breaks)) {
breaks = data %>% group_by_(x) %>%
summarise_(yvar=interp(~ sum(yy), yy=as.name(y)))
breaks = pretty_breaks(n=nbreaks)(c(0, breaks$yvar))
}
ggplot(data, aes_string(x, y)) +
geom_bar(stat = "identity") +
theme_tufte() +
scale_y_continuous(breaks=breaks) +
geom_hline(yintercept = breaks, col="white", lwd=lwd)
}
现在测试函数:
fnc(mtcars, "mpg", "cyl")
fnc(mtcars, "mpg", "cyl", nbreaks=2)
fnc(iris, "Petal.Width", "Petal.Length", breaks=seq(0,80,20))
fnc(iris, "Petal.Width", "Petal.Length", nbreaks=6, lwd=1)
多年来我一直在使用 Tufte 线和 ggplot2,但我一直想知道是否有一种自动绘制它们的方法,所以它们对应于轴抽动。
我通常画它们的方式是这样的:
ggplot(mtcars, aes(x=mpg, y=cyl))+
geom_bar(stat = "identity")+
theme_tufte()+
geom_hline(yintercept = c(5,10,15), col="white", lwd=3)
这里我用 yintercept = c(5,10,15) 指定刻度,但最近我正在构建一个带有变化轴的 Shiny 应用程序,所以我不能指定固定刻度。
有没有办法让我说类似 yintercept = tickmarks 的东西,这样我的 Shiny 应用程序就可以一直运行,而无需手动预先计算和定义轴和 Tufte 线?
您可以使用 ggplot_build
将刻度线位置提取为向量,然后将其传递给 geom_hline
的 yintercept
参数:
p <- ggplot(mtcars, aes(x=mpg, y=cyl))+
geom_bar(stat = "identity")+
theme_tufte()
tickmarks <- ggplot_build(p)$layout$panel_ranges[[1]]$y.major_source
p + geom_hline(yintercept = tickmarks, col="white", lwd=3)
这是一个计算中断位置的函数,然后将它们应用于 scale_y_continuous
和 geom_hline
:
library(ggthemes)
library(scales)
library(lazyeval)
library(tidyverse)
fnc = function(data, x, y, nbreaks=5, lwd=3, breaks=NULL) {
if(is.null(breaks)) {
breaks = data %>% group_by_(x) %>%
summarise_(yvar=interp(~ sum(yy), yy=as.name(y)))
breaks = pretty_breaks(n=nbreaks)(c(0, breaks$yvar))
}
ggplot(data, aes_string(x, y)) +
geom_bar(stat = "identity") +
theme_tufte() +
scale_y_continuous(breaks=breaks) +
geom_hline(yintercept = breaks, col="white", lwd=lwd)
}
现在测试函数:
fnc(mtcars, "mpg", "cyl")
fnc(mtcars, "mpg", "cyl", nbreaks=2)
fnc(iris, "Petal.Width", "Petal.Length", breaks=seq(0,80,20))
fnc(iris, "Petal.Width", "Petal.Length", nbreaks=6, lwd=1)