在R

2014-01-23 88 views
2

中繪製並填充類似棋盤的區域(和類似圖)我需要一些關於如何繪製2D圖並在R中有效填充它們的建議。我需要形象化一些數學「古怪」,比如謝爾賓斯基墊片或簡單的棋盤 - 並且收到類似以下的效果:在R

enter image description here

enter image description here

我想關於使用複數來定義點,但仍不清楚如何填充特定區域(例如以兩種不同的顏色)。

+0

[看看96頁](http://learnr.files.wordpress.com/2009/08/latbook。pdf) – marbel

+0

如果你可以'繪製'東西,你可以'多邊形'它填充顏色 –

+2

看看這裏的拼字遊戲板(答案2)http://stackoverflow.com/questions/21280738/setting-up -a-scrabble-game-in-r – Troy

回答

8

像這樣的東西?用矩陣表示你的數據

mx <- matrix(rep(c(T, F), 5), nrow=3, ncol=3) 
#  [,1] [,2] [,3] 
# [1,] TRUE FALSE TRUE 
# [2,] FALSE TRUE FALSE 
# [3,] TRUE FALSE TRUE   

,然後開始融化/圖:

library(reshape2) 
library(ggplot2) 
ggplot(melt(mx), aes(x=Var1, y=Var2, fill=value)) + geom_tile() 

enter image description here

這就是你想要的?

+0

謝謝BrodieG!這在我的問題中不會那麼簡單(請參閱我的更新後的文章),但它給了我一個提示,簡單地*組*點,以便使用ggplot2根據這個分組進行排隊和填充。 –

+0

@Marciszka,是的,只要你有每個點的座標,並且可以標記一個點處於你應該能夠做到的狀態。另外,如果你有大數據集,你可能想使用['geom_raster()'](http://docs.ggplot2.org/current/geom_raster.html) – BrodieG

4

geom_raster()對於相同形狀的正方形瓷磚將是最快的。

可能是你想要geom_polygon() - 這裏是謝爾賓斯基:

記得用coord_fixed(ratio=1)或形狀的比例將擴展到您的瀏覽器的形狀:

編輯 - 對不起實現看着它我沒有給你謝爾賓斯基(不知道我在想什麼)固定

enter image description here

require(ggplot2) 
require(reshape2) 
t.h<-sin(2*pi/6) # eq triangle unit height 

sierpinski<-function(iter=3){ 
    n<-2^iter 
    points<-ldply((n-1):0,function(x){ 
    data.frame(
     y=rep(n-x-1,x)*t.h/n, 
     x=seq((from=(0.5/n)+(n-x)*(0.5/n)),by=1/n,length.out=x) 
    ) 
    }) 

    points$id<-1:nrow(points) 

    rbind(
    points, 
    points+matrix(c((t.h/n),(-0.5/n),0),nrow(points),ncol=3,byrow=T), 
    points+matrix(c((t.h/n),(0.5/n),0),nrow(points),3,byrow=T) 
) 
} 

axiom<-data.frame(x=c(0,0.5,1),y=c(0,t.h,0)) 

iterations<-6 

ggplot() + theme_bw() + coord_fixed(ratio=1) + 
    geom_polygon(data=axiom,aes(x,y), fill="orange") + 
    lapply(1:iterations,function(x){ 
    geom_polygon(data=sierpinski(x),aes(x,y,group=id), fill="white") 
    }) 

此外,您應該注意這些非常精確的遞歸&系列型號。有時ggplot不會像您期望的那樣提供精確的圖像。例如請參閱下面的地圖灰塵圖:

使用ggplot(使用柵格),您可以看到,即使使用高分辨率輸出,「腿」看起來不一致,但從數學上知道它們是。如果您下載圖片並進行縮放,您會在底部看到不一致的情況。

enter image description here

在下面的代碼,我已經展示瞭如何通過動態創建原始PNG文件生成自己精確的圖像。如果你需要精確度,不要害怕這樣做!原始圖像生成的輸出如下:

祝你好運!

enter image description here

# CANTOR 

# NUMBER OF ROWS 
n<-9 

# MATRIX 
m<-matrix(sapply(n:1,function(x){ 
    str.zero<-rep(0,3^(x-1)) 
    str.one<-rep(1,3^(x-1)) 
    rep(c(str.one,str.zero),length.out=3^(n-1)) 
}),nrow=n,byrow=T) 

# CLEANUP 
m.cantor<-apply(m,2,cumprod)  

# ggplot 

ggplot(melt(m.cantor)) + theme_bw() + 
    geom_raster(aes(x=Var2,y=-Var1,alpha=value),color="white") 

# MAKE IMAGE FROM RAW DATA 
# LIBRARIES REQUIRED 
require(png) 

# AT THE MOMENT WE HAVE A SHORT, WIDE MATRIX 
dim(m.cantor) 
# [1] 9 6561 
# so let's scale it up say * 700 to make an approx square image (9 x 700 = 6300 ~ 6561) 
# basically we're running through each row and replicating x 700 
# then putting the pixels in a matrix with the new height (n=9 * 700) 
new.m<-matrix(sapply(1:n,function(x)rep(m.cantor[x,],700)),nrow=n*700,byrow=T) 

dim(new.m) # check the size 
#[1] 6300 6561  * OK! 

# then let's put it in raw image format 
# png expects an array of 4 matrices, R,G,B and alpha 

img.raw<-array(c((1-new.m), # R,G,B pixels oinverted so 1=shading 
       (1-new.m), # no G 
       (1-new.m), # no B 
       new.m^0 #note I'm putting this to ^0 to make all alphas 1 
       ), 
       dim=c(dim(new.m),4)) 


writePNG(img.raw,"cantor.png")