如何使用R中的forestplot包在forestplot中创建图例?

如何使用R中的forestplot包在forestplot中创建图例?,r,forestplot,R,Forestplot,我正在尝试创建一个类似这样的forestplot-> 图1 我在创建图例时遇到困难,如图右侧所示 我的数据如下: Gene_ID HR low high Gene_1 0.83 0.78 0.89 Gene_2 0.61 0.51 0.74 Gene_3 0.85 0.8 0.9 Gene_4 0.77 0.7 0.84 Gene_5 0.75 0.68 0.83 Gene_6 0.81 0.76

我正在尝试创建一个类似这样的forestplot->

图1

我在创建图例时遇到困难,如图右侧所示

我的数据如下:

Gene_ID HR      low     high
Gene_1  0.83    0.78    0.89
Gene_2  0.61    0.51    0.74
Gene_3  0.85    0.8     0.9
Gene_4  0.77    0.7     0.84
Gene_5  0.75    0.68    0.83
Gene_6  0.81    0.76    0.87
Gene_7  0.85    0.81    0.9
Gene_8  0.8     0.74    0.86
Gene_9  0.82    0.76    0.88
Gene_10 0.8     0.73    0.87
library(forestplot)
genes_df <- read.table("data.txt", header=T, sep="\t")

data <- structure(list(HR  = c(NA,genes_df$HR), 
                       low = c(NA,genes_df$low),
                       high = c(NA,genes_df$high)),
                       .Names = c("HR", "low", "high"), 
                       row.names = c(NA,-11L), 
                       class = "data.frame")

labels <- cbind(c("Gene_ID","Gene_1","Gene_2","Gene_3","Gene_4","Gene_5","Gene_6","Gene_7","Gene_8","Gene_9","Gene_10"),
                   c("HR","0.83","0.61","0.85","0.77","0.75","0.81","0.85","0.8","0.82","0.8"),
                   c("low","0.78","0.51","0.8","0.7","0.68","0.76","0.81","0.74","0.76","0.73"),
                   c("high","0.89","0.74","0.9","0.84","0.83","0.87","0.9","0.86","0.88","0.87"))

print("....Creating the plot....")                 
jpeg(filename="Hazard_ratio_plot.jpg",units="cm",width=20,height=17, res=800)
forestplot(labels, 
           data,new_page = TRUE,
           boxsize = .25,
           zero = 0.707,
           ci.vertices = TRUE,
           ci.vertices.height = 0.25,
           xlog=TRUE, 
           cex = 0.1,
           graph.pos = 2,
           lwd.zero = gpar(lty=1, alpha = 1),
           lineheight = "auto",
           title = "Hazard ratio plot",
           txt_gp = fpTxtGp(label=gpar(fontfamily="Calibri")),
           col = fpColors(box="blue",line="black",zero = "black"),
           xlab="Hazard ratio")
dev.off()
我可以得到图,但我不能得到如图1右侧所示的图例

我的代码如下:

Gene_ID HR      low     high
Gene_1  0.83    0.78    0.89
Gene_2  0.61    0.51    0.74
Gene_3  0.85    0.8     0.9
Gene_4  0.77    0.7     0.84
Gene_5  0.75    0.68    0.83
Gene_6  0.81    0.76    0.87
Gene_7  0.85    0.81    0.9
Gene_8  0.8     0.74    0.86
Gene_9  0.82    0.76    0.88
Gene_10 0.8     0.73    0.87
library(forestplot)
genes_df <- read.table("data.txt", header=T, sep="\t")

data <- structure(list(HR  = c(NA,genes_df$HR), 
                       low = c(NA,genes_df$low),
                       high = c(NA,genes_df$high)),
                       .Names = c("HR", "low", "high"), 
                       row.names = c(NA,-11L), 
                       class = "data.frame")

labels <- cbind(c("Gene_ID","Gene_1","Gene_2","Gene_3","Gene_4","Gene_5","Gene_6","Gene_7","Gene_8","Gene_9","Gene_10"),
                   c("HR","0.83","0.61","0.85","0.77","0.75","0.81","0.85","0.8","0.82","0.8"),
                   c("low","0.78","0.51","0.8","0.7","0.68","0.76","0.81","0.74","0.76","0.73"),
                   c("high","0.89","0.74","0.9","0.84","0.83","0.87","0.9","0.86","0.88","0.87"))

print("....Creating the plot....")                 
jpeg(filename="Hazard_ratio_plot.jpg",units="cm",width=20,height=17, res=800)
forestplot(labels, 
           data,new_page = TRUE,
           boxsize = .25,
           zero = 0.707,
           ci.vertices = TRUE,
           ci.vertices.height = 0.25,
           xlog=TRUE, 
           cex = 0.1,
           graph.pos = 2,
           lwd.zero = gpar(lty=1, alpha = 1),
           lineheight = "auto",
           title = "Hazard ratio plot",
           txt_gp = fpTxtGp(label=gpar(fontfamily="Calibri")),
           col = fpColors(box="blue",line="black",zero = "black"),
           xlab="Hazard ratio")
dev.off()
我的y轴标签包含列中的所有值:Gene_ID、HR、low和high。使用参数graph.pos=2,我可以分离y轴标签:HR、low和high,并将其放置在绘图的右侧,使其看起来像绘图的图例

但是,当我尝试使用相同的方法,即使用参数legend获取图例时,我得到以下错误:

fn.legend[[i]]中出错:“closure”类型的对象不可子集


我不明白这个错误是什么。

决定图表列的参数是:graph.pos


不确定这个函数,但您可以很容易地在ggplot中重新创建一个类似的图形。数据是否只给出了速率和界限?或者你能挑出所有的值来得到每个基因的分布吗?如果您能够获得所有数据,那么该图只是一个堆叠的箱线图。然后,您可以用所需的图例信息对图形进行注释,或者更改ggplot创建的图例的文本。@creutzml实际上我没有每个基因的所有值。无论我在问题中展示了什么数据,都是我所拥有的。另外,我尝试使用ggplot2创建一个类似的图形,但我仍然坚持使用图例部分。。。coef、low和high是什么结构?我猜其中一个不同于其他具有不同观察次数或不同结构的。因此,请确保它们是相同的。如果是,则应解决第一个错误。另外,似乎出现了第二条错误消息,因为您试图对数据进行子集划分。无论出于何种原因,fn.legend[[i]]试图执行,但fn.legend是一个函数,它是不可子集的。请使用可复制的示例编辑该问题,我可能能够更具体地指出它。@creutzml forestplot需要参数mean、lower和upper。因此,我创建了一个数据框架,其中包含这些参数的值。我编辑了R代码部分的问题。请看一下。你的建议真的很有帮助。我已将数据硬编码到labeltext参数中,并再次绘制它。它成功了,我得到了我的阴谋。不过,这并不能解决传奇的问题。在我的方法中,我以labeltext的形式给出了我的数据,它实际上是y轴标签,然后使用你的suggestion graph.pos分离标签和图例。你需要用一个功能完整的示例更新你的示例,并突出显示你需要的内容。正如你提到的,我用一个可复制的示例更新了我的问题。此外,我还强调了我到底需要什么。