R Markdown

This is an R Markdown document. Markdown is a simple formatting syntax for authoring HTML, PDF, and MS Word documents. For more details on using R Markdown see http://rmarkdown.rstudio.com.

When you click the Knit button a document will be generated that includes both content as well as the output of any embedded R code chunks within the document. You can embed an R code chunk like this:

summary(cars)
##      speed           dist       
##  Min.   : 4.0   Min.   :  2.00  
##  1st Qu.:12.0   1st Qu.: 26.00  
##  Median :15.0   Median : 36.00  
##  Mean   :15.4   Mean   : 42.98  
##  3rd Qu.:19.0   3rd Qu.: 56.00  
##  Max.   :25.0   Max.   :120.00

Including Plots

You can also embed plots, for example:

Note that the echo = FALSE parameter was added to the code chunk to prevent printing of the R code that generated the plot.

Image Vector

library(magick)
## Linking to ImageMagick 6.9.12.3
## Enabled features: cairo, freetype, fftw, ghostscript, heic, lcms, pango, raw, rsvg, webp
## Disabled features: fontconfig, x11

Contoh ini menyangkut gambar tunggal. Namun semua fungsi dalam sulap telah divektorisasi untuk mendukung bekerja dengan lapisan, komposisi, atau animasi. Metode dasar standar [ [[, c() dan length() digunakan untuk memanipulasi vektor gambar yang kemudian dapat diperlakukan sebagai lapisan atau bingkai

Layers Kita dapat menumpuk lapisan di atas satu sama lain seperti yang kita lakukan di Photoshop:

bigdata <- image_read('https://jeroen.github.io/images/bigdata.jpg')
frink <- image_read("https://jeroen.github.io/images/frink.png")
logo <- image_read("https://jeroen.github.io/images/Rlogo.png")
img <- c(bigdata, logo, frink)
img <- image_scale(img, "300x300")
image_info(img)
##   format width height colorspace matte filesize density
## 1   JPEG   300    225       sRGB FALSE        0   72x72
## 2    PNG   300    232       sRGB  TRUE        0   72x72
## 3    PNG   148    300       sRGB  TRUE        0   72x72

Mosaik mencetak gambar di atas satu sama lain, memperluas kanvas keluaran sedemikian rupa sehingga semuanya pas:

image_mosaic(img)

Perataan menggabungkan lapisan menjadi satu gambar yang memiliki ukuran gambar pertama:

image_flatten(img)

Perataan dan mosaik memungkinkan untuk menentukan operator komposit alternatif:

image_flatten(img, 'Add')

image_flatten(img, 'Modulate')

image_flatten(img, 'Minus')

Mengkombinasikan

Menambahkan berarti hanya menempatkan bingkai di samping satu sama lain:

image_append(image_scale(img, "x200"))

Gunakan stack = TRUE untuk memposisikannya di atas satu sama lain:

image_append(image_scale(img, "100"), stack = TRUE)

Menulis memungkinkan untuk menggabungkan dua gambar pada posisi tertentu:

bigdatafrink <- image_scale(image_rotate(image_background(frink, "none"), 300), "x200")
image_composite(image_scale(bigdata, "x400"), bigdatafrink, offset = "+180+100")

Pages

Saat membaca dokumen PDF, setiap halaman menjadi elemen vektor. Perhatikan bahwa PDF dirender saat membaca sehingga Anda harus segera menentukan kepadatannya.

manual <- image_read_pdf('https://cloud.r-project.org/web/packages/magick/magick.pdf', density = 72)
image_info(manual)
##    format width height colorspace matte filesize density
## 1     PNG   612    792       sRGB  TRUE        0   72x72
## 2     PNG   612    792       sRGB  TRUE        0   72x72
## 3     PNG   612    792       sRGB  TRUE        0   72x72
## 4     PNG   612    792       sRGB  TRUE        0   72x72
## 5     PNG   612    792       sRGB  TRUE        0   72x72
## 6     PNG   612    792       sRGB  TRUE        0   72x72
## 7     PNG   612    792       sRGB  TRUE        0   72x72
## 8     PNG   612    792       sRGB  TRUE        0   72x72
## 9     PNG   612    792       sRGB  TRUE        0   72x72
## 10    PNG   612    792       sRGB  TRUE        0   72x72
## 11    PNG   612    792       sRGB  TRUE        0   72x72
## 12    PNG   612    792       sRGB  TRUE        0   72x72
## 13    PNG   612    792       sRGB  TRUE        0   72x72
## 14    PNG   612    792       sRGB  TRUE        0   72x72
## 15    PNG   612    792       sRGB  TRUE        0   72x72
## 16    PNG   612    792       sRGB  TRUE        0   72x72
## 17    PNG   612    792       sRGB  TRUE        0   72x72
## 18    PNG   612    792       sRGB  TRUE        0   72x72
## 19    PNG   612    792       sRGB  TRUE        0   72x72
## 20    PNG   612    792       sRGB  TRUE        0   72x72
## 21    PNG   612    792       sRGB  TRUE        0   72x72
## 22    PNG   612    792       sRGB  TRUE        0   72x72
## 23    PNG   612    792       sRGB  TRUE        0   72x72
## 24    PNG   612    792       sRGB  TRUE        0   72x72
## 25    PNG   612    792       sRGB  TRUE        0   72x72
## 26    PNG   612    792       sRGB  TRUE        0   72x72
## 27    PNG   612    792       sRGB  TRUE        0   72x72
## 28    PNG   612    792       sRGB  TRUE        0   72x72
## 29    PNG   612    792       sRGB  TRUE        0   72x72
## 30    PNG   612    792       sRGB  TRUE        0   72x72
## 31    PNG   612    792       sRGB  TRUE        0   72x72
## 32    PNG   612    792       sRGB  TRUE        0   72x72
## 33    PNG   612    792       sRGB  TRUE        0   72x72
## 34    PNG   612    792       sRGB  TRUE        0   72x72
## 35    PNG   612    792       sRGB  TRUE        0   72x72
## 36    PNG   612    792       sRGB  TRUE        0   72x72
## 37    PNG   612    792       sRGB  TRUE        0   72x72
## 38    PNG   612    792       sRGB  TRUE        0   72x72
## 39    PNG   612    792       sRGB  TRUE        0   72x72
## 40    PNG   612    792       sRGB  TRUE        0   72x72
## 41    PNG   612    792       sRGB  TRUE        0   72x72
## 42    PNG   612    792       sRGB  TRUE        0   72x72
## 43    PNG   612    792       sRGB  TRUE        0   72x72
## 44    PNG   612    792       sRGB  TRUE        0   72x72
manual[1]

Animasi

Alih-alih memperlakukan elemen vektor sebagai lapisan, kita juga bisa menjadikannya bingkai dalam animasi!

image_animate(image_scale(img, "200x200"), fps = 1, dispose = "previous")

Morphing membuat urutan n gambar yang secara bertahap mengubah satu gambar menjadi gambar lainnya. Itu membuat animasi

newlogo <- image_scale(image_read("https://jeroen.github.io/images/Rlogo.png"))
oldlogo <- image_scale(image_read("https://jeroen.github.io/images/Rlogo-old.png"))
image_resize(c(oldlogo, newlogo), '200x150!') %>%
  image_background('white') %>%
  image_morph() %>%
  image_animate(optimize = TRUE)

Jika Anda membaca file GIF atau Video yang ada, setiap bingkai menjadi lapisan:

banana <- image_read("https://jeroen.github.io/images/banana.gif")
banana <- image_scale(banana, "150")
image_info(banana)
##   format width height colorspace matte filesize density
## 1    GIF   150    148       sRGB  TRUE        0   72x72
## 2    GIF   150    148       sRGB  TRUE        0   72x72
## 3    GIF   150    148       sRGB  TRUE        0   72x72
## 4    GIF   150    148       sRGB  TRUE        0   72x72
## 5    GIF   150    148       sRGB  TRUE        0   72x72
## 6    GIF   150    148       sRGB  TRUE        0   72x72
## 7    GIF   150    148       sRGB  TRUE        0   72x72
## 8    GIF   150    148       sRGB  TRUE        0   72x72

Memanipulasi masing-masing bingkai dan mengembalikannya ke dalam animasi:

background <- image_background(image_scale(logo, "200"), "white", flatten = TRUE)

# Combine and flatten frames
frames <- image_composite(background, banana, offset = "+70+30")

# Turn frames into animation
animation <- image_animate(frames, fps = 10, optimize = TRUE)
print(animation)
##   format width height colorspace matte filesize density
## 1    gif   200    155       sRGB  TRUE        0   72x72
## 2    gif    94    105       sRGB  TRUE        0   72x72
## 3    gif   125    122       sRGB  TRUE        0   72x72
## 4    gif   108    118       sRGB  TRUE        0   72x72
## 5    gif   108    105       sRGB  TRUE        0   72x72
## 6    gif    92    105       sRGB  TRUE        0   72x72
## 7    gif   113    123       sRGB  TRUE        0   72x72
## 8    gif   119    118       sRGB  TRUE        0   72x72

Animasi dapat disimpan sebagai GIF dari file MPEG:

image_write(animation, "Rlogo-banana.gif")

Gambar dan Grafis

Tambahan yang relatif baru untuk paket ini adalah perangkat grafis R asli yang menghasilkan objek gambar tenung. Ini dapat digunakan seperti perangkat biasa untuk membuat plot, atau sebagai alternatif untuk membuka perangkat yang menarik ke gambar yang ada menggunakan koordinat piksel.

fig <- image_graph(width = 400, height = 400, res = 96)
ggplot2::qplot(mpg, wt, data = mtcars, colour = cyl)
## Warning: `qplot()` was deprecated in ggplot2 3.4.0.
dev.off()
## magick 
##      3

Kita dapat dengan mudah melakukan pasca-proses gambar menggunakan operasi gambar biasa.

out <- image_composite(fig, frink, offset = "+70+30")
print(out)
## # A tibble: 1 × 7
##   format width height colorspace matte filesize density
##   <chr>  <int>  <int> <chr>      <lgl>    <int> <chr>  
## 1 PNG      400    400 sRGB       TRUE         0 96x96

Menggambar Device

Cara lain untuk menggunakan perangkat grafis adalah dengan menggambar di atas gambar yang keluar menggunakan koordinat piksel

img <- image_draw(frink)
rect(20, 20, 200, 100, border = "red", lty = "dashed", lwd = 5)
abline(h = 300, col = 'blue', lwd = '10', lty = "dotted")
text(30, 250, "Hoiven-Glaven", family = "monospace", cex = 4, srt = 90)
palette(rainbow(11, end = 0.9))
symbols(rep(200, 11), seq(0, 400, 40), circles = runif(11, 5, 35),
  bg = 1:11, inches = FALSE, add = TRUE)
dev.off()
## png 
##   2
print(img)
## # A tibble: 1 × 7
##   format width height colorspace matte filesize density
##   <chr>  <int>  <int> <chr>      <lgl>    <int> <chr>  
## 1 PNG      220    445 sRGB       TRUE         0 72x72

Secara default image_draw() menyetel semua margin ke 0 dan menggunakan koordinat grafik untuk mencocokkan ukuran gambar dalam piksel (lebar x tinggi) dengan (0,0) adalah sudut kiri atas. Perhatikan bahwa ini berarti sumbu y bertambah dari atas ke bawah yang merupakan kebalikan dari koordinat grafis pada umumnya. Anda dapat mengganti semua ini dengan meneruskan nilai xlim, ylim, atau mar khusus ke image_draw.

Grafis yang teranimasikan

Perangkat grafis mendukung banyak bingkai yang membuatnya mudah untuk membuat grafik animasi. Kode di bawah ini menunjukkan bagaimana Anda akan mengimplementasikan contoh dari paket gganimate yang sangat keren menggunakan perangkat grafis magick.

library(gapminder)
## Warning: package 'gapminder' was built under R version 4.2.3
library(ggplot2)
## Warning: package 'ggplot2' was built under R version 4.2.3
img <- image_graph(600, 340, res = 96)
datalist <- split(gapminder, gapminder$year)
out <- lapply(datalist, function(data){
  p <- ggplot(data, aes(gdpPercap, lifeExp, size = pop, color = continent)) +
    scale_size("population", limits = range(gapminder$pop)) + geom_point() + ylim(20, 90) + 
    scale_x_log10(limits = range(gapminder$gdpPercap)) + ggtitle(data$year) + theme_classic()
  print(p)
})
dev.off()
## png 
##   2
animation <- image_animate(img, fps = 2, optimize = TRUE)
print(animation)
## # A tibble: 12 × 7
##    format width height colorspace matte filesize density
##    <chr>  <int>  <int> <chr>      <lgl>    <int> <chr>  
##  1 gif      600    340 sRGB       TRUE         0 96x96  
##  2 gif      385    243 sRGB       TRUE         0 96x96  
##  3 gif      395    237 sRGB       TRUE         0 96x96  
##  4 gif      374    232 sRGB       TRUE         0 96x96  
##  5 gif      393    225 sRGB       TRUE         0 96x96  
##  6 gif      373    234 sRGB       TRUE         0 96x96  
##  7 gif      354    234 sRGB       TRUE         0 96x96  
##  8 gif      308    210 sRGB       TRUE         0 96x96  
##  9 gif      320    260 sRGB       TRUE         0 96x96  
## 10 gif      331    218 sRGB       TRUE         0 96x96  
## 11 gif      356    208 sRGB       TRUE         0 96x96  
## 12 gif      347    208 sRGB       TRUE         0 96x96

Untuk menulisnya ke file, Anda cukup melakukannya:

image_write(animation, "gapminder.gif")

Gambar Raster

Gambar magick juga dapat dikonversi menjadi objek raster untuk digunakan dengan perangkat grafis R. Dengan demikian kita dapat menggabungkannya dengan alat grafis lainnya. Namun harap diperhatikan bahwa perangkat grafis R sangat lambat dan memiliki sistem koordinat yang sangat berbeda yang mengurangi kualitas gambar.

Dasar R Raster

Base R memiliki format as.raster yang mengubah gambar menjadi vektor string. Makalah Raster Images in R Graphics oleh Paul Murrell memberikan gambaran umum yang bagus.

plot(as.raster(frink))

plot(cars)
rasterImage(frink, 21, 0, 25, 80)

Package Grid

Paket grid mempermudah overlay raster pada perangkat grafis tanpa harus menyesuaikan koordinat x/y dari plot.

library(ggplot2)
library(grid)
qplot(speed, dist, data = cars, geom = c("point", "smooth"))
## `geom_smooth()` using method = 'loess' and formula = 'y ~ x'

grid.raster(frink)

Ekstraksi Teks OCR

Tambahan terbaru untuk paket ini adalah mengekstraksi teks dari gambar menggunakan OCR. Ini membutuhkan paket tesseract:

library("tesseract")
img <- image_read("http://jeroen.github.io/images/testocr.png")
print(img)
## # A tibble: 1 × 7
##   format width height colorspace matte filesize density
##   <chr>  <int>  <int> <chr>      <lgl>    <int> <chr>  
## 1 PNG      640    480 sRGB       TRUE     23359 72x72

cat(image_ocr(img))
## This is a lot of 12 point text to test the
## ocr code and see if it works on all types
## of file format.
## 
## The quick brown dog jumped over the
## lazy fox. The quick brown dog jumped
## over the lazy fox. The quick brown dog
## jumped over the lazy fox. The quick
## brown dog jumped over the lazy fox.