我想结合丰富的 html 小部件(主要是plotly和networkD3),以及将它们排列为R网格中的绘图的可能性,将它们导出为出版物的pdf图形。但是,如果我在 R 中创建一些 html 小部件对象并尝试使用gridExtra::grid.arrange()排列它们(请参见下面的最小示例),我会收到以下错误:
\n\nError in gList(list(x = list(links = list(source = c(0, 0), target = c(1, : \nonly \'grobs\' allowed in "gList"\nRun Code Online (Sandbox Code Playgroud)\n\n我搜索了 \xe2\x80\x9cconverting html widgets to grobs 或plots\xe2\x80\x9d 以便能够将它们排列在网格中,但找不到任何相关信息。我可以采用漫长的手动方式,首先使用htmlwidgets::saveWidget()将 html 小部件保存为网站,然后使用webshot::webshot()将其转换为 pdf,并使用矢量图形编辑器手动排列图形(例如墨景)。但尽管需要手动操作,所有转换步骤都可能会导致质量下降。
\n\n也许我可以以某种方式用表格或列排列 LaTeX R-Markdown 文档中的图形,并指定纸张尺寸以适合我的绘图。但不知怎的,这感觉不像是一个理想的解决方案,因为我可能想将我的图表动态地排列在多个列和行中,添加标题等,这将使 LaTeX/knitr 中的排列变得相当复杂。
\n\n因此,在我开始手动将所有内容编织在一起之前,我想问您是否知道更好的方法来排列一些 html 小部件图并将它们导出到 R 中的 pdf 中?
\n\n最小的例子
\n\n这是一个重现我的问题的小例子。让\xe2\x80\x99s 说我的目标是一个图表,通过将两个不同过程的能量流相互比较(带有networkD3的桑基图),将它们排列在网格中,如下所示:\n示例性排列桑基图
\n\n这将是我的代码:
\n\nlibrary(networkD3)\nlibrary(grid)\nlibrary(gridExtra)\n\n## Create simplified Data\ndfSankey <- list()\ndfSankey$nodes <- data.frame(Name …Run Code Online (Sandbox Code Playgroud) I\xc2\xb4m 尝试在页面中排列 4 个图,将图例放在底部中心
\n\n我用它来获取其中一个图的图例(因为它们对于四个图来说是相同的)
\n\n get_legend<-function(myggplot){\n tmp <- ggplot_gtable(ggplot_build(myggplot))\n leg <- which(sapply(tmp$grobs, function(x) x$name) == "guide-box")\n legend <- tmp$grobs[[leg]]\n return(legend)\n }\nRun Code Online (Sandbox Code Playgroud)\n\n然后,我从任何情节中得到图例
\n\n legend <- get_legend(p2)\nRun Code Online (Sandbox Code Playgroud)\n\n所以对于我使用的图:
\n\n tt <-grid.arrange(arrangeGrob(p6, p7, p8, p9, legend,\n nrow = 2, #\n left = textGrob("Mammalian species richness", rot = 90, vjust = 1, \n gp = gpar(fontsize = 12))))\nRun Code Online (Sandbox Code Playgroud)\n\n但我\xc2\xb4得到的是这样的:
\n\n\n\n如何将图例移动到中心按钮并具有 2 行 2 列? \ncommands nrow,ncol没有工作,因为我收到了错误消息,也没有类似的东西
tt <- tt + theme(legend.position ="bottom"). …Run Code Online (Sandbox Code Playgroud) 我用来egg对齐页面上的多个绘图。我想知道是否可以通过标题a)而c)不是绘图区域来对齐两列?谢谢!
代码:
library(egg)
library(grid)
p1 <- ggplot(mtcars, aes(mpg, wt, colour = factor(cyl))) +
geom_point() + ggtitle("a)")
p1
p2 <- ggplot(mtcars, aes(mpg, wt, colour = factor(cyl))) +
geom_point() + facet_wrap(~ cyl, ncol = 2, scales = "free") +
guides(colour = "none") +
theme() + ggtitle("b)")
p2
p3 <- ggplot(mtcars, aes(mpg, wt, colour = factor(cyl))) +
geom_point() + facet_grid(. ~ am, scales = "free") + guides(colour="none") +
ggtitle("c)")
p3
g1 <- ggplotGrob(p1)
g2 <- ggplotGrob(p2)
g3 …Run Code Online (Sandbox Code Playgroud) 我正在使用 R闪亮,想在 gridExtra 的帮助下并排放置几个 ggplotly 图。
一张图(没有 gridExtra)效果很好:
library(shiny)
library(plotly)
u <- fluidPage(plotlyOutput(outputId = "myplots"))
s <- function(input, output) {
pt1 <- reactive({
ggplotly(qplot(42))
})
output$myplots <- renderPlotly({
pt1()
})
}
shinyApp(u, s)
Run Code Online (Sandbox Code Playgroud)
现在,当我尝试通过 gridExtra 添加另一幅图时,它拒绝工作:
library(shiny)
library(plotly)
library(gridExtra)
u <- fluidPage(plotlyOutput(
outputId = "myplots"
))
s <- function(input, output){
pt1 <- reactive({
ggplotly(qplot(42))
})
pt2 <- reactive({
ggplotly(qplot(57))
})
output$myplots <- renderPlotly({
grid.arrange(pt1(), pt2(),
widths = c(1, 1),
ncol = 2)
})
}
shinyApp(u, s)
Run Code Online (Sandbox Code Playgroud)
给我
gList 中的错误:“gList”中仅允许“grobs”
我正在尝试生成 10 对图,每页图有几对,并使用循环for来构造这些图对。但是,这些图会作为单独的图而不是页面发送到设备。
下面的 MWE 对于基础图形和ggplot版本具有相同的结构,但基础图形可以工作,也ggplot可以不工作。我需要做什么才能使第二个版本中的分页正确?
library(ggplot2)
attach(mtcars)
# correct configuration
par(mfrow=c(2,2))
for (ii in 1:3){
vars <- c("wt", "disp", "wt")
plot(get(vars[ii]), mpg)
hist(get(vars[ii]))
}
# places each on separate plot
par(mfrow=c(2,2))
for (ii in 1:3){
vars <- c("wt", "disp", "wt")
p <- ggplot(mtcars, aes(get(vars[ii]), mpg)) + geom_point(size=4)
plot(p)
p <- ggplot(mtcars, aes(get(vars[ii]))) + geom_histogram()
plot(p)
}
detach(mtcars)
Run Code Online (Sandbox Code Playgroud) 我正在尝试制作一个函数,它将为我提供一个可以用于indesign,illustrator或inkscape的情节.在尝试这样做时,我遇到了两个我无法解决的问题.
1)设置我的绘图的宽度和高度(或只是grobTable):我得到的输出非常小,当在illustrator中升级它时,字体跟随并变为大的方式.因此,我想制作手动定义的宽度和高度的图.
2)有时标题,注释和rownames会"放错位置"(有关详细信息,请参阅第1和第2小节之间的区别).当rownames很短时就会发生这种情况.
library(gridExtra)
library(ggplot2)
data(diamonds)
## plot function
kryds.row <- function(x,y, p=100, decor="%", digits=3,
titel="", note="", red=219, green=55, blue= 153){
c <- table(x, y)
s <- as.character(sum(c))
s <- paste("Antal svarpersoner=", s, sep=" ")
j <- prop.table(c,1)
r <- c(rownames(j),"Total")
k <- c(colnames(j), "Total")
j <- addmargins(j, margin =2, FUN = sum)
j <- round(j, digits)
j[]<-paste(j*p, decor, sep=" ")
farve <- rgb(red,green,blue, maxColorValue =255)
table <- tableGrob(j,
cols = k,
gpar.coretext = gpar(fontsize = 12),
gpar.coltext = gpar(fontsize …Run Code Online (Sandbox Code Playgroud) 我试图使用grid.arrange绘制彼此相邻的多个图形.具体来说,我希望这些图有一个共享的x轴标签和底部的图例.这是我用于排列的代码(这里的工作示例),没有通用x轴:
plot.c <- grid.arrange(arrangeGrob(plot.3 +
theme(legend.position="none"),
plot.2 + theme(legend.position="none"),
plot.4 + theme(legend.position="none"),
nrow=1),
my.legend,
main="Title goes here",
left=textGrob("Y Axis", rot = 90, vjust = 1),
nrow=2,heights=c(10, 1))
Run Code Online (Sandbox Code Playgroud)
图例是TableGrob对象; 通用x轴应该是一个textGrob沿线
bottom=textGrob("X Axis")
Run Code Online (Sandbox Code Playgroud)
但是,如果我将其添加到代码中,则图例将移动到右侧.如果我指示图例和标签都位于底部,则其中一个仍然移动到右侧.因此,问题是,是否有一种方法可以将通用x轴标签与底部的图例相结合?
在对齐网格图形对象时遇到一些麻烦 - 已经阅读了我能找到的所有文档,包括Murrell书籍,但没有成功.我认为我想做的事情非常简单,所以希望我很简单.
这是一个可重现的例子,它将在Hadley的hflights包中按目的地制作所有航空承运人的PDF (反映我在不同的数据集上尝试做的事情).
require(hflights)
require(gridExtra)
require(Cairo)
make_table <- function(df) {
p <- tableGrob(
df
,padding.h=unit(.25, "mm")
,show.rownames=FALSE
,gpar.coretext = gpar(fontsize=8, lineheight=0)
#this doesn't seem to justify the table
,just = c("bottom")
,show.box = T
)
return(p)
}
dests <- unique(hflights$Dest)
#list to hold the plots
plot_list <- list()
#loop over destinations and make a simple report
for (i in dests) {
#just this destination
this_dest <- hflights[hflights$Dest == i, ]
#the title
title <- textGrob(label = …Run Code Online (Sandbox Code Playgroud) 我建立了一个函数,可以从@baptiste的答案中获得很多帮助,快速绘制表格.
plotTable<-function(data, title=NULL, footnote=NULL, fontsize=9, plotIt=TRUE, show.rownames=TRUE){
# Generic method to plot tabular data
# Built the base table with/without row names
if(show.rownames){
table <- tableGrob(data, theme=ttheme_default(
core=list(fg_params=list(fontsize=fontsize)),
colhead=list(fg_params=list(fontsize=fontsize)),
rowhead=list(fg_params=list(fontsize=fontsize))))
} else{
table <- tableGrob(data, theme=ttheme_default(
core=list(fg_params=list(fontsize=fontsize)),
colhead=list(fg_params=list(fontsize=fontsize)),
rowhead=list(fg_params=list(fontsize=fontsize))), rows=NULL)
}
# Set the padding
padding <- unit(0.5,"line")
# Add the title if it's not NULL
if(!is.null(title)){
title.grob <- textGrob(title, gp=gpar(fontsize=fontsize+3))
table <- gtable_add_rows(table, heights = grobHeight(title.grob) + padding, pos = 0)
table <- gtable_add_grob(table, list(title.grob), t=1, l=1, …Run Code Online (Sandbox Code Playgroud) 我试图用每个方面绘制有自己的传奇的方面.但是,我遇到了一些麻烦,无法正确对齐.
dat <- structure(list(group1 = structure(c(1L, 1L, 2L, 2L, 2L), .Label = c("A",
"B"), class = "factor"), group2 = structure(c(1L, 2L, 1L, 3L,
2L), .Label = c("a", "b", "c"), class = "factor"), x = c("1",
"2", "3", "4", "2"), y = c("1", "2", "3", "4", "3")), .Names = c("group1",
"group2", "x", "y"), row.names = c(NA, 5L), class = "data.frame")
dat <- split(dat, f = dat$group1)
library(ggplot2)
p1 <- ggplot(dat$A) +
geom_point(aes(x=x, y=y, colour=group2)) +
facet_wrap(~group1) +
guides(colour=guide_legend(nrow=2)) +
scale_colour_manual(values=c(a = …Run Code Online (Sandbox Code Playgroud)