2017-09-14 145 views
1

我試圖繪製矢量場geom_segment不改變大小,一些載體設置爲不可見,使用此代碼:GGPLOT2:如預期

library(cowplot) 

size <- 1/12 
strength <- 8 
centerx <- 0 
centery <- -12 
diagsize <- 200 

x <- rep(1:diagsize - diagsize/2, times = diagsize) 
y <- rep(1:diagsize - diagsize/2, each = diagsize) 
xend <- numeric() 
yend <- numeric() 
distance <- numeric() 
replace_factor_01 <- numeric() 
replace_factor <- numeric() 
h <- numeric() 

for (i in 1:(diagsize*diagsize)){ # 
    distance[i] <- sqrt((x[i]-centerx)^2+(y[i]-centery)^2) # simply get absolute distance of each pixel to lens center 
    replace_factor_01[i] <- 0 # this will be color intensity 
    replace_factor[i] <- 0 # wheras this will be arrow length 
    h[i] <- 0 # this will be color (0 = red, 0.667 = blue) 
    if (distance[i] < 2*3.141592/size){replace_factor_01[i] <- sin(distance[i]*size)} # if within range, compute distortion as value -1..1 
    replace_factor[i] <- replace_factor_01[i]*strength # linearly stretch 
    if (replace_factor[i] < 0){h[i] <- 0.667} # set color 
    xend[i] <- x[i] + (x[i]-centerx)/distance[i]*replace_factor[i] # compute distortion vector 
    yend[i] <- y[i] + (y[i]-centery)/distance[i]*replace_factor[i] 
    if ((x[i] %% 5) !=0 | (y[i] %% 5) != 0) {replace_factor_01[i] <- 0} # only set some arrows visible 
} 
data <- data.frame(x,y,distance, h, replace_factor_01,replace_factor,xend,yend) 

p <- ggplot(data,aes(x,y))+ 
    geom_segment(aes(xend=xend,yend=yend),col=hsv(h,abs(replace_factor_01),1)) 
    #geom_segment(aes(xend=xend,yend=yend),col=hsv(h,abs(replace_factor_01),1), size=5) 
print(p) 

結果看起來是這樣的:

Vectorfield no size

當我使用「大小= 5」,該行不只是變得更厚,但像這樣:

Vectorfield size 5

我發生了什麼問題?

+1

請提供一些示例數據與'dput()'。 – Mako212

+1

請參閱[在R中創建可重現示例](https://stackoverflow.com/a/5963610/4421870) – Mako212

+0

好的,抱歉,我認爲這個錯誤可能很明顯。我現在包含完整可重複的代碼。 –

回答

2

你的問題是,你實際上並沒有將任何細節設置爲「隱形」,而是將它們設置爲白色。 hsv(x,0,1)總是= #FFFFFF(白色)

如果我們看飽和度固定爲1的圖,我們可以看到問題。大量的部分被塗成白色,使它們與藍色和紅色部分重疊。當您增加size時,會加劇該問題。

p <- ggplot(data,aes(x,y))+ 
    geom_segment(aes(xend=xend,yend=yend),col=hsv(h,1,1)) 

enter image description here

我想你真正想要做的是所有的情節,其中replace_factor_01是段= 0。因此,我們使用data.table子集數據:

require(data.table) 
setDT(data) 
p <- ggplot(data[replace_factor_01 != 0],aes(x,y,color=distance))+ 
    geom_segment(aes(xend=xend,yend=yend),size=3) 

enter image description here

和一個最終版本,以匹配你的顏色 - 我映射replace_factor_01顏色(如果你con用vert h至因素,你可以使用scale_color_manual()獲得兩個分立的顏色一樣,你在劇情中定義):

p <- ggplot(data[replace_factor_01 != 0],aes(x,y))+ 
geom_segment(aes(xend=xend,yend=yend,color=replace_factor_01),size=2)+ 
scale_color_gradient(high="red",low="blue")+ 
theme(legend.position="none") 

enter image description here

+0

感謝您的方法!根據你的提示,我的上面的代碼實際上並沒有隱藏線條,現在我發現了這個替代方案:geom_segment(aes(xend = xend,yend = yend),col = hsv(h,1,1),alpha = abs(replace_factor_01),size = 3)' –