9

我想在 ggplot2 中复制在 LaTeX/pgf 中完成的组合表/图。

这是原始表格/情节:

在此处输入图像描述

这是,我使用 ggplot2 走了多远:

在此处输入图像描述

还有一些小问题(?),但我的主要问题是:如何添加表头?

它应该与元素正确对齐。

理想情况下,它还可以模仿原始示例中使用水平线的 booktabs 的外观。

有任何想法吗?

这是我目前使用的代码:

tmptable <-
    data.frame(Method=c("label", "svlabel", "libor", "rpirat", "Frankfurt", "high"),
               p=c(0.03, 0.38, 0.27, 0.31, 0.05, 0.36),
               p_lo=c(-0.05, 0.34, 0.21, 0.24, -0.03, 0.32),
               p_hi=c(0.11, 0.41, 0.33, 0.38, 0.13, 0.41))
plotPointsCIinMatrix(tmptable)

使用此功能:

plotPointsCIinMatrix <- function(data,
                                 cols=NULL,
                                 .label=1,
                                 .point_estimate=2,
                                 .ci_lo=3,
                                 .ci_hi=4,
                                 .digits=2) {
  if (!require("ggplot2"))
      stop("Need package 'ggplot2'")
  if (!require("reshape"))
      stop("Need package 'reshape'")
  if (!require("gridExtra"))
      stop("Need package 'gridExtra'")

  ## keep the order
  data[,.label] <- factor(data[,.label], levels=rev(unique(data[,.label])))

  ## reshape data for table plotting
  table_df <- data.frame(label=data[,.label],
                         point_estimate=data[,.point_estimate],
                         ci=paste0("[",
                             data[,.ci_lo],
                             "; ",
                             data[,.ci_hi],
                             "]"))
  table_df_melted <- melt(table_df, id.vars = "label")

  ## plot the table (part 1)
  plot_table <- 
      ggplot(table_df_melted, aes(y=label, x=variable)) +
          geom_text(aes(label=value)) +
              scale_x_discrete("", labels="", expand=c(0.4,0)) +
                  theme_minimal() +
                      theme(panel.grid.major=element_blank(),
                            panel.grid.minor=element_blank(),
                            axis.ticks=element_blank(),
                            axis.title.x=element_blank(),
                            axis.title.y=element_blank(),
                            axis.text.y=element_blank(),
                            plot.margin=unit(c(1,1,0.5,0), "lines"),
                            panel.margin=unit(0, "cm"))

  ## plot the ci-plot (part 2)
  plotname_point_estimate <- colnames(data[,.point_estimate, drop=FALSE])
  plotname_label <- colnames(data[,.label, drop=FALSE])
  plotname_ci_lo <- colnames(data[,.ci_lo, drop=FALSE])
  plotname_ci_hi <- colnames(data[,.ci_hi, drop=FALSE])
  plot_ci <-
      ggplot(data,
             aes_string(x=plotname_point_estimate, y=plotname_label)) +
          geom_segment(aes_string(x=plotname_ci_lo,
                                  xend=plotname_ci_hi,
                                  yend=plotname_label),
                       colour="grey70",
                       lwd=0.5,
                       leneend="round",
                       arrow=arrow(angle=90, ends="both", length = unit(0.15, "cm"))) +
          geom_point(aes_string(colour=plotname_label), size=4) +
              (if (is.null(cols)) {
                  scale_color_discrete(guide=FALSE)
                } else {
                  scale_color_manual(guide=FALSE, values=cols)
                }) +
          expand_limits(x=1) +
          geom_vline(aes(x=0), lty="dashed", lwd=0.9, colour="grey70") +
          theme_minimal() +
          theme(axis.title.y=element_blank(),
                axis.title.x=element_blank(),
                axis.ticks=element_blank(),
                axis.text.y=element_text(size=15, hjust=0),
                plot.margin=unit(c(1,0,0.5,0.5), "lines"))

  gp <- ggplot_gtable(ggplot_build(plot_ci))
  gdata.table <- ggplot_gtable(ggplot_build(plot_table))
  maxHeight = grid::unit.pmax(gp$heights[2:3], gdata.table$heights[2:3])
  gp$heights[2:3] <- as.list(maxHeight)
  gdata.table$heights[2:3] <- as.list(maxHeight)
  library("gridExtra")
  a <- arrangeGrob(gp, gdata.table,
                   ##clip = FALSE,
                   ncol = 2,
                   widths = unit(c(10,5),
                       c("null", "null")))

  a
}
4

1 回答 1

1

您可以通过放置选项来添加表格标题main = "Put your title here!"

我知道这不是您正在寻找的东西,但您可能能够在arrangeGrob框架中工作。另一种方法是在 LaTeX 中制作表格标题并将图形与其完美对齐。

这是我更改的功能部分:

... previous code in plotPointsCIinMatrix()

library("gridExtra")
a <- arrangeGrob(gp, gdata.table,
               ##clip = FALSE,
               ncol = 2,
               widths = unit(c(10,5),
                             c("null", "null")),
               main = "Put your title here!")

a
}

于 2013-09-22T19:34:30.677 回答