Автоматически использовать метки (семантику убежища) на графиках ggplot2
Я строю данные, размеченные с использованием семантики гавани, то есть переменные и значения имеют метки, определенные с помощью атрибутов.
Часто эти метки также являются тем, что я хочу в названиях и галочках моих осей.
library(ggplot2)
mtcars$mpg = haven::labelled(mtcars$mpg, labels = c("low" = 10, "high" = 30))
attributes(mtcars$mpg)$label = "miles per gallon"
ggplot(mtcars, aes(mpg, cyl)) + geom_point() +
scale_x_continuous(attributes(mtcars$mpg)$label,
breaks = attributes(mtcars$mpg)$labels,
labels = names(attributes(mtcars$mpg)$labels))
Могу ли я написать помощника, который заменит этот трудоемкий оператор scale_x_continuous чем-то, что может быть легко повторено? Например, что-то вроде scale_x_continuous(label_from_attr, breaks = breaks_from_attr, labels = value_labels_from_attr)
, Или, может быть, даже + add_labels_from_attributes()
заменить все это?
Я знаю, что могу писать / использовать помощников, таких как Hmisc::label
немного сократить код атрибута выше, но это не то, что я хочу здесь.
1 ответ
У меня нет хорошего масштаба, но вы можете использовать такую функцию:
label_x <- function(p) {
b <- ggplot_build(p)
x <- b$plot$data[[b$plot$labels$x]]
p + scale_x_continuous(
attributes(x)$label,
breaks = attributes(x)$labels,
labels = names(attributes(x)$labels)
)
}
Тогда используйте как (+
не буду делать)
p <- ggplot(mtcars, aes(mpg, cyl)) + geom_point()
label_x(p)
В качестве альтернативы используйте трубу:
mtcars %>% { ggplot(., aes(mpg, cyl)) + geom_point() } %>% label_x()
Старое решение
use_labelled <- function(l, axis = "x") {
if (axis == "x") {
scale_x_continuous(attributes(l)$label,
breaks = attributes(l)$labels,
labels = names(attributes(l)$labels))
}
if (axis == "y") {
scale_y_continuous(attributes(l)$label,
breaks = attributes(l)$labels,
labels = names(attributes(l)$labels))
}
}
Тогда вы просто даете:
ggplot(mtcars, aes(mpg, cyl)) + geom_point() + use_labelled(mtcars$cyl)
Или для оси Y:
ggplot(mtcars, aes(cyl, mpg)) + geom_point() + use_labelled(mtcars$cyl, "y")
Другой подход - написать оболочку для ggplot(), у которой есть собственный класс. Тогда атрибуты будут полностью видны при вызове соответствующего метода печати. Видеть?ag.print
из пакета "ямлет" (0.2.1).
library(ggplot2)
library(yamlet)
library(magrittr)
mtcars$disp %<>% structure(label = 'displacement', unit = 'cu. in.')
mtcars$mpg %<>% structure(label = 'mileage', unit = 'miles/gallon')
mtcars$am %<>% factor(levels = c(0,1), labels = c('automatic','manual'))
mtcars$am %<>% structure(label = 'transmission')
agplot(mtcars, aes(disp, mpg, color = am)) + geom_point()