如何將三向色彩漸變(熱圖)填充到三角形(三角形圖),如下所示。三向色彩漸變填充r
plot(NA,NA,xlim=c(0,1),ylim=c(0,sqrt(3)/2),asp=1,bty="n",axes=F,xlab="",ylab="")
segments(0,0,0.5,sqrt(3)/2)
segments(0.5,sqrt(3)/2,1,0)
segments(1,0,0,0)
顏色應平行於triplot運行。
如何將三向色彩漸變(熱圖)填充到三角形(三角形圖),如下所示。三向色彩漸變填充r
plot(NA,NA,xlim=c(0,1),ylim=c(0,sqrt(3)/2),asp=1,bty="n",axes=F,xlab="",ylab="")
segments(0,0,0.5,sqrt(3)/2)
segments(0.5,sqrt(3)/2,1,0)
segments(1,0,0,0)
顏色應平行於triplot運行。
下面是做這件事 - 這是一個黑客位,用點繪製一塊梯度片:
plot(NA,NA,xlim=c(0,1),ylim=c(0,1),asp=1,bty="n",axes=F,xlab="",ylab="")
segments(0,0,0.5,sqrt(3)/2)
segments(0.5,sqrt(3)/2,1,0)
segments(1,0,0,0)
# sm - how smooth the plot is. Higher values will plot very slowly
sm <- 500
for (y in 1:(sm*sqrt(3)/2)/sm){
for (x in (y*sm/sqrt(3)):(sm-y*sm/sqrt(3))/sm){
## distance from base line:
d.red = y
## distance from line y = sqrt(3) * x:
d.green = abs(sqrt(3) * x - y)/sqrt(3 + 1)
## distance from line y = - sqrt(3) * x + sqrt(3):
d.blue = abs(- sqrt(3) * x - y + sqrt(3))/sqrt(3 + 1)
points(x, y, col=rgb(1-d.red,1 - d.green,1 - d.blue), pch=19)
}
}
和輸出:
難道你想使用這些漸變來表示數據?如果是這樣,可能需要更改d.red
,d.green
和d.blue
來做到這一點 - 儘管如此,我還沒有測試過任何類似的東西。我希望這有些幫助,但例如使用colorRamp
的適當解決方案可能會更好。
編輯:根據baptiste的建議,這是如何將信息存儲在向量中並一次繪製出來的。這是相當快(特別是與sm
設定爲500,例如):
plot(NA,NA,xlim=c(0,1),ylim=c(0,1),asp=1,bty="n",axes=F,xlab="",ylab="")
sm <- 500
x <- do.call(c, sapply(1:(sm*sqrt(3)/2)/sm,
function(i) (i*sm/sqrt(3)):(sm-i*sm/sqrt(3))/sm))
y <- do.call(c, sapply(1:(sm*sqrt(3)/2)/sm,
function(i) rep(i, length((i*sm/sqrt(3)):(sm-i*sm/sqrt(3))))))
d.red = y
d.green = abs(sqrt(3) * x - y)/sqrt(3 + 1)
d.blue = abs(- sqrt(3) * x - y + sqrt(3))/sqrt(3 + 1)
points(x, y, col=rgb(1-d.red,1 - d.green,1 - d.blue), pch=19)
下面是與光柵化的背景圖像中的溶液。 tricol
函數的sharpness
參數控制顏色漸變爲黑色的速度。將它設置爲1會給你愛德華的顏色,並將其設置爲2會給你下面的顏色。
# Coordinates of the triangle
tri <- rbind(sin(0:2*2/3*pi), cos(0:2*2/3*pi))
# Function for calculating the color of a set of points `pt`
# in relation to the triangle
tricol <- function(pt, sharpness=2){
require(splancs)
RGB <- sapply(1:3, function(i){
a <- sweep(pt, 2, tri[,i])
b <- apply(tri[,-i], 1, mean) - tri[,i]
sharpness*((a %*% b)/sum(b^2))-sharpness+1
})
RGB[-inpip(pt,t(tri)),] <- 1 # Color points outside the triangle white
do.call(rgb, unname(as.data.frame(pmin(pmax(RGB, 0), 1))))
}
# Plot
res <- 1000 # Resolution
xi <- seq(-1, 1, length=res) # Axis points
yi <- seq(-.8, 1.2, length=res)
x <- xi[1] + cumsum(diff(xi)) # Midpoints between axis points
y <- yi[1] + cumsum(diff(yi))
xy <- matrix(1:(length(x)*length(y)), length(x))
image(xi, yi, xy, col=tricol(as.matrix(expand.grid(x,y))), useRaster=TRUE)
lines(tri[1,c(1:3,1)], tri[2,c(1:3,1)], type="l")
tricol()
做什麼是代表每個角落i
用一個顏色(紅,綠,藍)。它定義了從角落到pt
中的點以及從角落到相對邊緣中心的矢量b
的矢量矩陣a
。然後它將a
投影到b
並縮放以獲得相對距離=顏色強度(並且使用sharpness
來調整顏色的小黑客)。當談到像這樣的問題時,簡單的代數可以發揮魔力。
由於鋸齒,您會在邊緣周圍產生小噪音,但是您可能會調整該鋸齒,或者在三角形中繪製稍寬的線條。
我正在考慮一個類似的想法,但是三角形邊上的三個圓盤(R,G,B)和一個alpha通道漸變爲0.我相信R會自動進行顏色混合。 – baptiste 2012-08-06 19:28:33
類別。它會顯示哪個圈子是在其他圈子的頂部繪製的。比方說紅色在上面,然後是綠色,然後是藍色。在中間你會有50%的紅色,但只有25%的綠色(50%的剩餘50%)和12.5%的藍色。幾乎每一個我見過的維恩圖都受到了這個困擾,一旦我看到它,我就不能停下來注意它。 [拿這些例子](http://stackoverflow.com/questions/8713994/venn-diagram-in-r-proportional-and-color-shading-possible-semi-transparency-sup)。 – Backlin 2012-08-06 19:34:27
這是我的工作彌補了phonR
包的實現......不導出fillTriangle
功能,所以你必須使用:::
操作符來訪問它。示例顯示了基於pch和基於柵格的方法。
# set up color scale
colmap <- plotrix::color.scale(x=0:100, cs1=c(0, 180), cs2=100, cs3=c(25, 100),
alpha=1, color.spec='hcl')
# specify triangle vertices and corner colors
vertices <- matrix(c(1, 4, 2, 1, 3, 4, length(colmap), 1, 30), nrow=3,
dimnames=list(NULL, c("x", "y", "z")))
# edit next line to change density/resolution
xseq <- yseq <- seq(0, 5, 0.01)
grid <- expand.grid(x=xseq, y=yseq)
grid$z <- NA
grid.indices <- splancs::inpip(grid, vertices[,1:2], bound=FALSE)
grid$z[grid.indices] <- with(grid[grid.indices,],
phonR:::fillTriangle(x, y, vertices))
# plot it
par(mfrow=c(1,2))
# using pch
with(grid, plot(x, y, col=colmap[round(z)], pch=16))
# overplot original triangle
segments(vertices[,1], vertices[,2], vertices[c(2,3,1),1],
vertices[c(2,3,1),2])
points(vertices[,1:2], pch=21, bg=colmap[vertices[,3]], cex=2)
# using raster
image(xseq, yseq, matrix(grid$z, nrow=length(xseq)), col=colmap)
# overplot original triangle
segments(vertices[,1], vertices[,2], vertices[c(2,3,1),1],
vertices[c(2,3,1),2])
points(vertices[,1:2], pch=21, bg=colmap[vertices[,3]], cex=2)
感謝偉大的解決方案......是有辦法開始在更暗的顏色(紅,綠,藍),使梯度看起來更加犀利 – jon 2012-08-04 21:44:22
我已經嘗試了幾個不同的讓漸變變得更銳利的事情,但是我找不到一種不會使圖形區域變得非常暗淡和枯燥的方式。紅色,綠色和藍色從角落開始,你還好嗎?如果是,請嘗試用'points(x,y,col = rgb(d.red,d.green,d)替換最後一行代碼。藍色),pch = 19)' - 這三種顏色的漸變看起來更清晰,因爲它們在起源時不會與其他顏色混合太多。 – Edward 2012-08-04 22:56:01
你爲什麼要單獨繪製每個點?您可以存儲顏色矢量並一次繪製所有點。 – baptiste 2012-08-04 23:12:41