使用s3方法和对象属性格式化ggplot刻度

时间:2019-05-03 14:46:11

标签: r ggplot2 formatting

我有两个自定义类,它们具有不同类型的构造函数和不同类型的格式化方法,一个类依赖于对象的属性。

as.test_1 <- function(x, test_attribute, ...) {
  attributes(x) <- list("test_attribute" = test_attribute)
  x <-
    structure(x, class = c("test_1", setdiff(class(x), "test_1")))
  return(x)
}

format.test_1  <- function(x, ...) {
  paste0(x, attributes(x)$test_attribute)
}

print.test_1 <- function(x, ...) {
  cat(format(x, ...), "\n")
}

as.test_2 <- function(x, test_attribute, ...) {
  x <-
    structure(x, class = c("test_2", setdiff(class(x), "test_2")))
  return(x)
}

format.test_2  <- function(x, ...) {
  paste0(x, "test")
}

print.test_2 <- function(x, ...) {
  cat(format(x, ...), "\n")
}

现在,我想绘制一些包含这些类的数据:

library(data.table)

data_1 <-
  data.table(a = as.test_1(c(1, 2, 3, 4), test_attribute = "test"),
             b = as.factor(c("a", "b", "c", "d")))
data_2 <-
  data.table(a = as.test_2(c(1, 2, 3, 4), test_attribute = "test"),
             b = as.factor(c("a", "b", "c", "d")))

我也想使用format方法来格式化y轴。这是我的第一次尝试,它适用于不依赖于格式化变量的属性的test_2类:

library(ggplot2)
plot_data <- function(data) {
  g <- ggplot(data, aes(x = b, y = a))
  g <- g +  geom_bar(stat = "identity")
  expand <- c(0, 0)
  attributes(expand) <- attributes(data$a)
  limits <- c(0, 4)
  attributes(limits) <- attributes(data$a)
  g <- g + scale_y_continuous(
    expand = expand,
    limits = limits,
    oob = scales::squish,
    labels = getS3method(f = "format", class = class(data$a)[[1]])
  )
  return(print(g))
}

但是对于test_1类,似乎在scale_y_continuous调用中某个位置丢失了属性。

plot_data(data_1)

enter image description here

plot_data(data_2)

enter image description here

有人知道如何解决此问题吗? 谢谢!

0 个答案:

没有答案