在HTML Rmarkdown中的图表标题

9

在使用RMarkdown转换到HTML时,是否有可能将标题移到图形之上?似乎在PDF格式中可以实现,即在转换为PDF时,但是我不知道如何在HTML中实现。我正在使用bookdown对图形进行编号。

当我运行以下代码时:

```{r fig.cap= "caption"}
df <- data.frame(letter = letters[1:5], value = 1)

ggplot(df, aes(as(factor(1), value, fill = letters))) +
  geom_bar(stat = "identity")

```

标题会显示在图片底部,但我想要将它显示在图片上方。


1
这似乎是合理的,希望有标题选项在上方。表格上方和图形下方的惯例不需要强制执行!这曾经在 bookdown github 上被讨论为一个问题,但没有得到解决。 - Mark Neal
1
这里的代码对我来说似乎可以工作。 - dyrland
感谢@dyrland,不过那个解决方案抑制了bookdown提供的图表编号。 - Mark Neal
4个回答

11

对于HTML输出,您可以设置chunk选项fig.topcaption = TRUE将标题放置在图像上方。以下是一个最小示例(适用于html_documentbookdown的HTML输出格式):

---
title: "Reprex"
output:
  html_document: null
  bookdown::html_document2: null
---

```{r, fig.cap='A caption.', fig.topcaption=TRUE}
plot(cars)
```

图片上方的标题


1
那比我想象的要容易得多!不幸的是,使用 ggplotlyggplot() 转换为 plotly 对象似乎会将标题发送到底部,但编号仍然保留。我会尝试修改我的答案中的示例来展示这一点。 - Mark Neal
1
请参见此处的下面部分答案示例,其中显示了使用 plotly 对象时标题会恢复到底部。 - Mark Neal
1
在这里查看带有一些 CSS 的 Plotly 对象的解决方案:链接 - Mark Neal
1
fig.topcaption 钩子在任何地方都有文档记录吗? - camille

4
你可以这样做,但如果设置echo = TRUE,标题将出现在代码之上...
---
title: "Untitled"
author: "Stéphane Laurent"
date: "29 février 2020"
output: html_document
---

```{r setup, include=FALSE}
knitr::knit_hooks$set(htmlcap = function(before, options, envir) {
  if(before) {
    paste('<p class="caption">', options$htmlcap, "</p>",sep="")
  }
})
```

```{r, echo = FALSE, htmlcap="Hello Dolly"}
library(ggplot2)
ggplot(diamonds,aes(price,carat)) + geom_point()
```

1
Stéphane提出的答案和dyrland建议的链接中的答案都将标题移动到图像上方。 Stephane的解决方案的缺点(如上所述)是如果echo=TRUE,则它会出现在代码上方。 更大的缺点是,使用这两种解决方案,bookdown提供的自动编号似乎被抑制了。 因为这不是我的问题,所以我想做一个回答来展示这一点。 - Mark Neal

3

虽然没有得出成功的答案,但是代码输出显示使用bookdown格式时会标记数字,但使用Stéphane提出的解决方案或者以下来自dyrland建议链接的解决方案可以避免这种情况。

---
title: "Untitled"
author: "Internet"
date: "29 février 2020"
output:
  bookdown::html_document2
---

```{r setup2}
#https://dev59.com/ZH3aa4cB1Zd3GeqPd3wK#26743812 
library(knitr)
knit_hooks$set(plot = function(x, options) {
  paste('<figure><figcaption>', options$fig.cap, '</figcaption><img src="',
        opts_knit$get('base.url'), paste(x, collapse = '.'),
        '"></figure>',
        sep = '')
}) #comment out to restore numbering

library(ggplot2)
```

```{r, echo = TRUE, fig.cap="Hello Dolly"}
ggplot(diamonds,aes(price,carat)) + geom_point()
```

解决方案能否同时包括编号和标题置于顶部?

注:原问题的作者提到了bookdown,但未提供完整的工作示例以演示此功能。如果其他人认为更有用,我很乐意编辑原问题。

编辑 Yihui在他的答案中展示了使用fig.topcaption=TRUE这个方便的选项-谢谢!不幸的是,该标题(对于plotly图形)虽然保留了正确的编号,但仍被推到底部。以下是示例:

---
title: "Untitled"
author: "Internet"
date: "29 février 2020"
output:
  bookdown::html_document2
---

```{r setup, message=FALSE, echo=FALSE}

library(knitr)
library(ggplot2)
library(plotly)

```

Here is a ggplot object with caption at the top as desired.


```{r, fig.cap="Hello ggplot", fig.topcaption=TRUE, message=FALSE, echo=FALSE}
ggplot(diamonds,aes(price,carat)) + geom_point()
```

Here is the previous ggplot converted to a plotly object with caption reverting to the bottom.


```{r, fig.cap="Hello plotly", fig.topcaption=TRUE, message=FALSE, echo=FALSE}
my_ggplot <- ggplot(diamonds,aes(price,carat)) + geom_point()
ggplotly(my_ggplot)
```

Caption reverts to bottom even if plotly object is not created from ggplot object

```{r, fig.cap="Hello plotly2", fig.topcaption=TRUE, message=FALSE, echo=FALSE}
plot_ly(
  x=c(1,2,3),
  y=c(5,6,7),
  type='scatter',
  mode='lines')
```

编辑2 使用CSS解决了Plotly字幕位置问题,链接在此


2

硬编码一个函数从来不是我的首选选项,但它有效(为表格创建另一个函数)。 (源代码在此处:R Markdown HTML Number Figures

现在,要想弄清如何引用这些内容...

---
title: "Untitled"
author: "Internet"
date: "29 fevrier 2020"
output:
  bookdown::html_document2
---

```{r setup2}
#https://dev59.com/ZH3aa4cB1Zd3GeqPd3wK#26743812 
library(knitr)
library(ggplot2)

capFigNo <- 1
capFig <- function(x){
      x <- paste0("Figure ",capFigNo,": ",x)
    capFigNo <<- capFigNo + 1
    x
}


knit_hooks$set(plot = function(x, options) {
  paste('<figure><figcaption>',
        options$fig.cap,
        '</figcaption><img src="',
        opts_knit$get('base.url'),
        paste(x, collapse = '.'),
        '"></figure>',
        sep = '')
}) #comment out to restore numbering

```


```{r echo = TRUE, fig.cap=capFig("Hello Dolly")}
#the trick is to wrap your caption in your number prefixing function.
ggplot(diamonds,aes(price,carat)) + geom_point()
```

```{r echo = TRUE, fig.cap=capFig("Hello Dolly2")}
ggplot(diamonds,aes(price,carat)) + geom_point()    
```

2
感谢@dyrland。那个方法可以用,但是对于章节内的编号,我需要修改代码来编号图表(例如在第5章中我们可能会有5.1、5.2甚至到5.11)。我希望比我更能干的人能够将一个通用解决方案纳入github问题,该问题是面向LaTeX的,现在已经关闭了。不过也许需要一个新问题来指定HTML解决方案-你怎么看? - Mark Neal
1
真正的答案是找到数字编号实际存储的位置(options$something或opts_knit$get("something")),并将其放在options$fig.cap之前。我只是找不到它存储的位置。 - dyrland
1
为了在章节中添加编号,请输入ChapterNo <- 5(例如,对于第5章),并将capFig函数的第二行编辑为x <- paste0("Figure ",ChapterNo,".",capFigNo,": ",x)。尽管如此,仍希望有一个更通用的解决方案! - Mark Neal

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接