Jak ustawić rozmiar lokalnego obrazu za pomocą knitr do przecen?


149

Mam lokalny obraz, który chciałbym dołączyć do .Rmdpliku, który następnie knitprzekonwertuję na slajdy HTML Pandoc. W tym poście spowoduje to wstawienie obrazu lokalnego:
![Image Title](path/to/your/image)

Czy istnieje sposób na zmodyfikowanie tego kodu, aby ustawić również rozmiar obrazu?


5
Aby uzyskać lepszą kontrolę nad rozmiarami, może się okazać, że będziesz musiał użyć tagu HTML img
Marius

5
drugi komentarz @ Mariusa: daringfireball.net/projects/markdown/syntax mówi „W chwili pisania tego tekstu Markdown nie ma składni do określania wymiarów obrazu; jeśli jest to dla Ciebie ważne, możesz po prostu użyć zwykłych tagów HTML <img> ”.
Ben Bolker,

12
Problem ze stosowaniem znaczników HTML polega na tym, że obraz nie jest już rozpoznawany jako zasób zewnętrzny w procesie konwersji Rmd, więc nie zostanie dołączony do samodzielnej wersji renderowanego kodu HTML.
fabians

Odpowiedzi:


101

Możesz również odczytać obraz, używając pngna przykład pakietu i wykreślić go jak zwykły wydruk, używając grid.rasterz gridpakietu.

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

Dzięki tej metodzie masz pełną kontrolę nad rozmiarem obrazu.


Dziękuję, to działa przy użyciu slidy. (Nie działa tak dobrze z dzslides, ale nie sądzę, że jest to problem z dostarczonym rozwiązaniem).
Adam Smith,

1
Cytaty wokół ścieżki pliku są wymagane w programie, img <- readPNG("path/to/your/image")ale nie udało mi się edytować rozwiązania.
Adam Smith

1
@AdamSmith Właśnie skopiowałem path/to/your/imageTwoje pytanie. Tak, nazwa ścieżki jest ciągiem i potrzebujesz cudzysłowów, aby zdefiniować ciąg. Mam nadzieję, że wszystko jasne.
agstudy

1
Uruchamiając to pod RStudio, utworzysz ogromny margines dla renderowanego png.
Paulo E. Cardoso

19
Przyszli czytelnicy: Ta odpowiedź jest nieaktualna .
CL.

190

Pytanie jest stare, ale wciąż poświęca się mu wiele uwagi. Ponieważ istniejące odpowiedzi są nieaktualne, tutaj bardziej aktualne rozwiązanie:

Zmiana rozmiaru obrazów lokalnych

Od knitr1.12 dostępna jest funkcja include_graphics. Od ?include_graphics(wyróżnienie moje):

Główną zaletą korzystania z tej funkcji jest to, że jest przenośna w tym sensie, że działa dla wszystkich obsługiwanych formatów dokumentów knitr, więc nie musisz zastanawiać się, czy musisz używać na przykład składni LaTeX lub Markdown, aby osadzić zewnętrzny wizerunek. Opcje fragmentów związane z wyjściem graficznym, które działają dla normalnych wykresów R, działają również dla tych obrazów, takich jak out.widthi out.height.

Przykład:

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

Zalety:

  • Nad odpowiedzią agastudy za : Nie ma potrzeby stosowania zewnętrznych bibliotek lub do ponownego rastrowy obraz.
  • Odpowiedź Shruti Kapoor : Nie ma potrzeby ręcznego pisania w HTML. Poza tym obraz jest zawarty w samodzielnej wersji pliku.

W tym wygenerowane obrazy

Aby skomponować ścieżkę do wykresu, który jest generowany w porcji (ale nie jest uwzględniony), przydatne mogą być opcje porcji opts_current$get("fig.path")(ścieżka do katalogu figury), a także opts_current$get("label")(etykieta bieżącej porcji). W poniższym przykładzie fig.pathuwzględniono drugi z dwóch obrazów, które zostały wygenerowane (ale nie zostały wyświetlone) w pierwszej porcji:

```{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")))
```

Ogólny wzorzec ścieżek do rysunków to [fig.path]/[chunklabel]-[i].[ext], gdzie chunklabeljest etykietą fragmentu, w którym wygenerowano iwykres , jest indeksem wykresu (w tym fragmencie) i extjest rozszerzeniem pliku (domyślnie pngw dokumentach RMarkdown).


18
W przypadku pliku PDF będziesz musiał określić jednostki dla wymiarów figury, np. W out.width='100pt'przeciwnym razie lateks wyświetli błąd dotyczący niedozwolonej jednostki miary.
andybega

4
Działa również dla wyjścia MS Word, ale wyjście.width i out.height nie działają
Ben

@andybega Dziękuję za komentarz; Włączyłem to do odpowiedzi.
CL.

2
prawdopodobnie chceszr, echo=FALSE, ...
Jameson Quinn

1
@jzadra Utwórz nowe pytanie z powtarzalnym kodem dla Twojego problemu. W tej chwili nie mogę odtworzyć twojego problemu (skopiowałem drugi fragment kodu dosłownie do pliku RMD i przerobiłem na HTML i Word).
CL.

112

Niezaktualizowana odpowiedź: w knitr 1.17możesz po prostu użyć

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

edytuj zgodnie z komentarzem z @jsb

Zauważ, że działa to tylko bez spacji, np. {Width = 250px} nie {width = 250px}


6
Wypróbowałem to w knitr 1.16 i nie zadziałało, gdy użyłem ioslides. Czy ta funkcja została następnie usunięta, czy jest to problem z ioslides?
Dr. Mike

2
U mnie też nie działa na najnowszej wersji wszystkich pakietów.
slhck

3
U mnie działa z knitr 1.17. Upewnij się, że piszesz bez spacji, np . {width=250px}Nie {width = 250px}.
jsb

2
U mnie działa, zdecydowanie najłatwiejsze rozwiązanie.
okręt wojenny

To nie będzie działać dla mnie używając xaringanz knitr_1.21.
Lyngbakr

37

Oto kilka opcji, które utrzymują samowystarczalność pliku bez ponownego przetwarzania obrazu:

Umieść obraz w divznacznikach

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

Użyj arkusza stylów

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;
}

Jeśli masz więcej niż jeden obraz, może być konieczne użycie pseudo-selektora podrzędnego n-tego dla tej drugiej opcji.


1
jest to dobre rozwiązanie, ale może być używane tylko z wyjściem html! Drugie wyjście zignoruje ustawienie
xhudik

<div> ... </div>Rozwiązanie wydaje się bardzo proste. Jakie jest styleustawienie przeskalowania obrazu do stałego procentu przy zachowaniu współczynnika proporcji?
user101089,

Spróbuj użyć% zamiast px.
Nick Kennedy,

20

Jeśli konwertujesz do formatu HTML, możesz ustawić rozmiar obrazu za pomocą składni HTML, używając:

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

lub jakąkolwiek wysokość i szerokość chcesz podać.


6
Problem z tym rozwiązaniem polega na tym, że obraz nie jest już rozpoznawany jako zasób zewnętrzny przez proces konwersji Rmd, więc nie zostanie uwzględniony w samodzielnej wersji renderowanego kodu HTML.
fabians

8

Miałem ten sam problem dzisiaj i znalazłem inną opcję knitr 1.16podczas robienia na drutach do PDF (co wymaga zainstalowania pandoc):

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

Ta metoda może wymagać nieco prób i błędów, aby znaleźć odpowiedni rozmiar. Jest to szczególnie wygodne, ponieważ sprawia, że ​​umieszczanie dwóch obrazów obok siebie jest ładniejszym procesem. Na przykład:

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

Możesz wykazać się kreatywnością i ułożyć kilka z nich obok siebie i dopasować je według własnego uznania. Więcej pomysłów i przykładów można znaleźć pod adresem https://rpubs.com/RatherBit/90926 .


2
czy to nie jest dokładnie to samo, co moja odpowiedź powyżej?
InspectorSands

2
@hermestrismegistus prawie, ale używam procent szerokości zamiast szerokości piksela. Okazało się, że ta opcja jest przydatna, ponieważ w moim konkretnym przypadku umieszczałem wiele obrazów obok siebie, co zachowywało się lepiej w ten sposób, niż gdy podałem dokładną szerokość
Taylor Pellerin

5

Inną opcją, która działała dla mnie, jest gra z opcją dpi w knitr::include_graphics()ten sposób:

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

... co z pewnością (chyba że wykonasz obliczenia matematyczne) jest metodą prób i błędów w porównaniu do definiowania wymiarów w porcji, ale może to komuś pomoże.


4

Rozwiązanie knitr :: include_graphics działało dobrze przy zmianie rozmiaru figur, ale nie byłem w stanie dowiedzieć się, jak go użyć do tworzenia obok siebie figur o zmienionym rozmiarze. Uważam, że ten post jest do tego przydatny.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.