2017-08-31 17 views
1

指定された角度(ではなく、は必ず90度の倍数)で回転したggplotにラスタ注釈をプロットする方法はありますか?特に、私は画像のスケールが変わらないようにする必要があります。ラスタ注釈を回転するggplot2

私がこれまでに試したことは、How to rotate an image R rasterという画像に基づいて、画像を回転して一時ファイルとして保存する機能を作成しました(perspで作成した画像を保存するための唯一の方法です) 、その後、それをggplot2::annotation_rasterでロードするという考え方に基づいています。

raster_rotate <- function(img, theta, width) { 
    # only works with square imgs right now 
    theta <- theta %% 90 
    b <- cos(theta) + sin(theta) 

    x1 <- 0:ncol(img) 
    y1 <- 0:nrow(img) 
    z <- matrix(1, nrow = length(x1), ncol = length(y1)) 
    col_mat <- t(apply(matrix(rgb(getValues(img)/255), nrow=nrow(img), byrow=TRUE), 2, rev)) 

    tmppath = tempfile(pattern = "img", fileext = ".png", tmpdir = "tmp/imgrot") 
    side = round(b * width) 
    png(filename = tmppath, width = side, height = side) 
    persp(x1, y1, z, zlim = c(0, 2), theta = theta, phi = 90, 
     col = col_mat, scale = FALSE, border = NA, box = FALSE) 
    dev.off() 
} 

角度が45度に近づくと同じ大きさのキャンバス内の画像を回転する画像を縮小するように表示されるので、私は回転するようにcos(theta) + sin(theta)倍キャンバスサイズを再スケーリングしなければなりません。私はpng関数にこのスケーリングを追加するときしかし、私はエラーを取得する: Error in png(filename = tmppath, width = side, height = side) : invalid 'width' or 'height'

私は私が私の厄介なハックを解決するために、このエラーの解決策を受け入れるだろうが、直接ggplotにこれを行うにはクリーンな方法があるかどうそれはさらに良いでしょう。

答えて

0

ここでマップを回転させる方法はありますか?それはちょっと微調整して問題を解決しますか?

library(tidyverse) 
rotate.axis <- function(xy,theta){ 
     pimult <- (theta * 2 * pi)/360 
     newx <- c(cos(pimult), sin(pimult)) 
     newy <- c(-sin(pimult), cos(pimult)) 
     XY <- as.matrix(xy) %*% cbind(newx, newy) 
     as.data.frame(XY) 
} 

ak <- map_data('world','USA:Alaska') 

newd <- data.frame(longitude=ak$long, latitude=ak$lat) 
rotate <- rotate.axis(newd,30) 
newak <- bind_cols(ak,rotate) 

オブジェクト

newak %>% 
    filter(long<0) %>% 
    ggplot() + geom_polygon(aes(long,lat,group=group),fill=8,color="black") 

回転したオブジェクト

newak %>% 
    filter(long<0) %>% 
    ggplot() + geom_polygon(aes(newx,newy,group=group),fill=8,color="black") 
+0

の回転なし、私は恐れていませんよ。そのマップの回転は、マップオブジェクトをポリゴンとしてプロットするので機能します。そのため、回転をポイントの変形として適用できます。しかし、ラスターイメージは全く異なってプロットされます。 – Empiromancer