Como definir o tamanho da imagem local usando o knitr para descontos?

149

Eu tenho uma imagem local que gostaria de incluir em um .Rmdarquivo que depois knitconverterei em slides HTML Pandoc. Por este post , isso irá inserir a imagem local:
![Image Title](path/to/your/image)

Existe uma maneira de modificar esse código para também definir o tamanho da imagem?

Adam Smith
fonte
5
Para um controle mais preciso sobre os tamanhos, você pode acabar tendo que usar um tag img HTML
Marius
5
segundo comentário de Marius: daringfireball.net/projects/markdown/syntax diz "Até o momento, Markdown não possui sintaxe para especificar as dimensões de uma imagem; se isso for importante para você, você pode simplesmente usar tags HTML regulares <img> . "
Ben Bolker 25/03
12
o problema ao usar tags HTML é que a imagem não é mais reconhecida como um recurso externo pelo processo de conversão de Rmd, portanto não será incluída em uma versão independente do HTML renderizado.
Fabians

Respostas:

101

Você também pode ler a imagem usando o pngpacote, por exemplo, e plotá-la como uma plotagem comum usando a grid.rasterpartir do gridpacote.

```{r fig.width=1, fig.height=10,echo=FALSE}
library(png)
library(grid)
img <- readPNG("path/to/your/image")
 grid.raster(img)
```

Com esse método, você tem controle total do tamanho da sua imagem.

estudo
fonte
Obrigado, isso funciona usando slidy. (Não funciona tão bem com dzslides, mas não acredito que seja um problema com a solução fornecida).
Adam Smith
1
São necessárias aspas sobre o caminho do arquivo, img <- readPNG("path/to/your/image")mas não consegui editar a solução.
Adam Smith
1
@ AdamSmith Acabei de copiar o seu path/to/your/imageda sua pergunta. Sim, o nome do caminho é uma string e você precisa de aspas para definir uma string. Espero que eu esteja claro.
agstudy
1
Ao executar isso no RStudio, você criará uma enorme margem para o png renderizado.
Paulo E. Cardoso
19
Futuros leitores: esta resposta está desatualizada .
CL.
190

A questão é antiga, mas ainda recebe muita atenção. Como as respostas existentes estão desatualizadas, aqui está uma solução mais atualizada:

Redimensionando imagens locais

A partir de knitr1.12 , existe a função include_graphics. De ?include_graphics(ênfase minha):

A principal vantagem do uso dessa função é que ela é portátil no sentido em que funciona para todos os formatos de documento knitrcompatíveis, portanto, você não precisa pensar se precisa usar, por exemplo, a sintaxe LaTeX ou Markdown, para incorporar uma interface externa. imagem. Opções de pedaço relacionadas à saída de gráficos que funcionam para gráficos R normais também funcionam para essas imagens, como out.widthe out.height.

Exemplo:

```{r, out.width = "400px"}
knitr::include_graphics("path/to/image.png")
```

Vantagens:

  • Sobre a resposta do agastudy : Não há necessidade de bibliotecas externas ou rasterização da imagem.
  • Sobre a resposta de Shruti Kapoor : Não há necessidade de escrever manualmente HTML. Além disso, a imagem está incluída na versão independente do arquivo.

Incluindo imagens geradas

Para compor o caminho para um gráfico que é gerado em um pedaço (mas não incluído), as opções de pedaço opts_current$get("fig.path")(caminho para o diretório de figuras) e também opts_current$get("label")(rótulo do pedaço atual) podem ser úteis. O exemplo a seguir usa fig.pathpara incluir a segunda das duas imagens que foram geradas (mas não exibidas) no primeiro pedaço:

```{r generate_figures, fig.show = "hide"}
library(knitr)
plot(1:10, col = "green")
plot(1:10, col = "red")
```

```{r}
include_graphics(sprintf("%sgenerate_figures-2.png", opts_current$get("fig.path")))
```

O padrão geral dos caminhos das figuras é [fig.path]/[chunklabel]-[i].[ext]: onde chunklabelestá o rótulo do pedaço em que a plotagem foi gerada, ié o índice do plot (nesse pedaço) e exta extensão do arquivo (por padrão pngnos documentos do RMarkdown).

CL.
fonte
18
Para saída em pdf, você precisará especificar unidades para as dimensões da figura, por exemplo out.width='100pt', caso contrário, o látex emitirá um erro sobre a unidade de medida ilegal.
andybega
4
Também funciona para a saída MS Word, mas o out.width e out.height não funcionam
Ben
@andybega Obrigado pelo seu comentário; Eu o incorporei na resposta.
CL.
2
você provavelmente vai quererr, echo=FALSE, ...
Jameson Quinn
1
@jzadra Crie uma nova pergunta com código reproduzível para o seu problema. No momento, não consigo reproduzir seu problema (copiei o segundo snippet de código literalmente para um arquivo RMD e tricotei em HTML e Word).
CL.
112

Uma resposta atualizada: knitr 1.17você pode simplesmente usar

![Image Title](path/to/your/image){width=250px}

edite conforme comentário de @jsb

Observe que isso funciona apenas sem espaços, por exemplo, {width = 250px} e não {width = 250px}

InspectorSands
fonte
6
Eu tentei isso no knitr 1.16 e não funcionou ao usar ioslides. Esse recurso foi removido ou é um problema do ioslides?
Dr. Mike
2
Também não funciona para mim, na versão mais recente de todos os pacotes.
slhck
3
Funciona para mim usando o knitr 1.17. Certifique-se de escrever sem espaços, por exemplo, {width=250px}não {width = 250px}.
ICC
2
Funciona para mim, a solução mais fácil de longe.
navio de guerra
Isso não funcionaria para mim usando xaringancom knitr_1.21.
Lyngbakr 31/01/19
37

Aqui estão algumas opções que mantêm o arquivo autônomo sem retasterar a imagem:

Embrulhe a imagem em divtags

<div style="width:300px; height:200px">
![Image](path/to/image)
</div>

Use uma folha de estilo

test.Rmd

---
title: test
output: html_document
css: test.css
---

## Page with an image {#myImagePage}

![Image](path/to/image)

test.css

#myImagePage img {
  width: 400px;
  height: 200px;
}

Se você tiver mais de uma imagem, poderá ser necessário usar o pseudo-seletor de enésimo filho para esta segunda opção.

Nick Kennedy
fonte
1
Esta é uma boa solução, mas pode ser usada apenas com saída html! A outra saída irá ignorar a configuração
xhudik
A <div> ... </div>solução parece muito simples. Qual é a styleconfiguração para redimensionar uma imagem para uma porcentagem fixa, mantendo a proporção?
user101089
Tente usar% em vez de px.
Nick Kennedy
20

Se você estiver convertendo para HTML, poderá definir o tamanho da imagem usando a sintaxe HTML usando:

  <img src="path/to/image" height="400px" width="300px" />

ou qualquer altura e largura que você queira fornecer.

Shruti Kapoor
fonte
6
o problema com esta solução é que a imagem não é mais reconhecida como um recurso externo pelo processo de conversão de Rmd, portanto não será incluída em uma versão independente do HTML renderizado.
Fabians
8

Teve o mesmo problema hoje e encontrou outra opção knitr 1.16ao tricotar em PDF (o que requer que você tenha o pandoc instalado):

![Image Title](path/to/your/image){width=70%}

Esse método pode exigir que você faça um pouco de tentativa e erro para encontrar o tamanho que funciona melhor para você. É especialmente conveniente porque torna a colocação de duas imagens lado a lado um processo mais bonito. Por exemplo:

![Image 1](path/to/image1){width=70%}![Image 2](path/to/image2){width=30%}

Você pode ser criativo e empilhar algumas delas lado a lado e dimensioná-las como achar melhor. Consulte https://rpubs.com/RatherBit/90926 para obter mais idéias e exemplos.

Taylor Pellerin
fonte
2
isso não é exatamente o mesmo que a minha resposta acima?
InspectorSands
2
@hermestrismegistus quase, mas estou usando porcentagem de largura em vez de largura de pixel. Eu encontrei esta opção seja útil, porque no meu caso particular, eu estava colocando várias imagens lado a lado, que se comportou melhor assim que quando eu dei exata largura
Taylor Pellerin
5

Outra opção que funcionou para mim é brincar com a opção dpi, knitr::include_graphics()assim:

```{r}
knitr::include_graphics("path/to/image.png", dpi = 100)
```

... que com certeza (a menos que você faça as contas) seja tentativa e erro em comparação com a definição de dimensões no bloco, mas talvez isso ajude alguém.

Jan Alleman
fonte
4

A solução knitr :: include_graphics funcionou bem para redimensionar as figuras, mas não consegui descobrir como usá-la para produzir figuras redimensionadas lado a lado. Achei este post útil para fazer isso.

SM
fonte