【问题标题】:Need help on ggplot in R, I am getting an error: 'argument "x" is missing, with no default'在 R 中需要关于 ggplot 的帮助,我收到一个错误:'缺少参数“x”,没有默认值'
【发布时间】:2018-06-08 15:30:23
【问题描述】:

[在此处输入图像描述][1]我正在尝试在 R 中创建一个 lowry 图,但在调试返回的错误时遇到了困难。我正在使用以下代码来创建情节:

   library(ggplot2)
   library(reshape)

m_xylene_data <- data.frame(
Parameter = c(
"BW", "CRE", "DS", "KM", "MPY", "Pba", "Pfaa", 
"Plia", "Prpda", "Pspda", "QCC", "QfaC", "QliC", 
"QPC", "QspdC", "Rurine", "Vfac", "VliC", "Vmax"),
"Main Effect" = c(
1.03E-01, 9.91E-02, 9.18E-07, 3.42E-02, 9.27E-3, 2.82E-2, 2.58E-05, 
1.37E-05, 5.73E-4, 2.76E-3, 6.77E-3, 8.67E-05, 1.30E-02, 
1.19E-01, 4.75E-04, 5.25E-01, 2.07E-04, 1.73E-03, 1.08E-03),
Interaction = c(
1.49E-02, 1.43E-02, 1.25E-04, 6.84E-03, 3.25E-03, 7.67E-03, 8.34E-05, 
1.17E-04, 2.04E-04, 7.64E-04, 2.84E-03, 8.72E-05, 2.37E-03, 
2.61E-02, 6.68E-04, 4.57E-02, 1.32E-04, 6.96E-04, 6.55E-04
)
)
fortify_lowry_data <- function(data, 
                           param_var = "Parameter", 
                           main_var = "Main.Effect", 
                           inter_var = "Interaction")
{
 #Convert wide to long format
mdata <- melt(data, id.vars = param_var)

#Order columns by main effect and reorder parameter levels
o <- order(data[, main_var], decreasing = TRUE)
data <- data[o, ]
data[, param_var] <- factor(
data[, param_var], levels = data[, param_var]
)

#Force main effect, interaction to be numeric
 data[, main_var] <- as.numeric(data[, main_var])
 data[, inter_var] <- as.numeric(data[, inter_var])

  #total effect is main effect + interaction
  data$.total.effect <- rowSums(data[, c(main_var, inter_var)])

  #Get cumulative totals for the ribbon
  data$.cumulative.main.effect <- cumsum(data[, main_var])
 data$.cumulative.total.effect <- cumsum(data$.total.effect)

 #A quirk of ggplot2 means we need x coords of bars
  data$.numeric.param <- as.numeric(data[, param_var])

 #The other upper bound
 #.maximum =  1 - main effects not included
 data$.maximum <- c(1 - rev(cumsum(rev(data[, main_var])))[-1], 1)

  data$.valid.ymax <- with(data, 
                       pmin(.maximum, .cumulative.total.effect)
  )

  mdata[, param_var] <- factor(
   mdata[, param_var], levels = data[, param_var]
  ) 
  list(data = data, mdata = mdata)
  }
    lowry_plot <- function(data,
                   param_var = "Parameter",
                   main_var = "Main.Effect",
                   inter_var = "Interaction",
                   x_lab = "Parameters",
                   y_lab = "Total Effects (= Main Effects + Interactions)",
                   ribbon_alpha = 0.5,
                   x_text_angle = 25)
  {
  #Fortify data and dump contents into plot function environment
 data_list <- fortify_lowry_data(data, param_var, main_var, inter_var)
  list2env(data_list, envir = sys.frame(sys.nframe()))

   p <- ggplot(data) +
    geom_bar(aes_string(x = param_var, y = "value", fill = "variable"),
         data = mdata) +
     geom_ribbon(
      aes(x = .numeric.param, ymin = .cumulative.main.effect, ymax = 
    .valid.ymax),
     data = data,
     alpha = ribbon_alpha) +
   xlab(x_lab) +
   ylab(y_lab) +
   scale_y_continuous(labels = "percent") +
   theme(axis.text.x = text(angle = x_text_angle, hjust = 1)) +
     scale_fill_grey(end = 0.5) +
    theme(legend.position = "top",
     legend.title =blank(),
     legend.direction = "horizontal"
     )
   p
   }

m_xylene_lowry <- lowry_plot(m_xylene_data)

当我运行代码时,它给了我以下错误:

错误:参数“x”丢失,没有默认值

这对我来说还不够具体,无法知道问题所在。是什么导致显示错误?如何使错误语句更详细?

Lowry PLOT

【问题讨论】:

  • @SUJANGHIMRE,“对于我来说,知道问题出在哪里还不够具体。是什么导致了错误的显示”,Rightly 说,因为调试这堆积如山的代码很痛苦!请参阅此thread 以了解和了解如何制作可重现的示例。
  • 具体是以下行中的text() 调用:theme(axis.text.x = text(angle = x_text_angle, hjust = 1))。但是,我不得不说您的代码中还有很多其他错误。 theme(legend.title =blank() 也不行。我强烈建议逐步重建您的代码,以确保它工作正常,而不是创建自定义函数。

标签: r ggplot2


【解决方案1】:

您的代码中似乎有不止一个错误元素,而不仅仅是它引发的错误。根据我的经验,在将代码放入函数之前首先检查代码是否按预期工作总是有帮助的。下面的绘图部分应该可以工作:

p <- ggplot(data) + # no need to give data here, if you overwrite it anyway blow, but does not affect outcome...
    # geom_bar does the counting but does not take y-value. Use geom_col:
    geom_col(aes_string(x = param_var, y = "value", fill = "variable"),
             data = mdata,
             position = position_stack(reverse = TRUE)) +
    geom_ribbon(
      aes(x = .numeric.param, ymin = .cumulative.main.effect, ymax = 
            .valid.ymax),
      data = data,
      alpha = ribbon_alpha) +
    xlab(x_lab) +
    ylab(y_lab) +
    # use scales::percent_format():
    scale_y_continuous(labels = scales::percent_format()) +
    # text is not an element you can use here, use element_text():
    theme(axis.text.x = element_text(angle = x_text_angle, hjust = 1)) +
    scale_fill_grey(end = 0.5) +
    # use element_blank(), not just blank()
    theme(legend.position = "top",
          legend.title = element_blank(),
          legend.direction = "horizontal"
    )

这至少绘制了一些东西,但我不确定它是否是你期望它做的。如果您可以显示所需的输出,将会有所帮助。

编辑:

添加position = position_stack(reverse = TRUE)根据样图排序。

【讨论】:

  • 附上情节LOWRY情节。请检查。
  • 我明白了。这可以使用position = position_stack(reverse = T) 来完成。相应地编辑了答案。
  • @Tino。非常感谢。
  • @SUJANGHIMIRE 考虑接受答案,如果它对你有用。
猜你喜欢
  • 1970-01-01
  • 2021-09-17
  • 2017-12-09
  • 2020-07-04
  • 2020-01-14
  • 2023-01-13
  • 2022-08-07
  • 1970-01-01
  • 2014-03-15
相关资源
最近更新 更多