我正在绘制大量的图形,我希望它们都具有相同的色标,以便我可以相互比较.这是我的代码:
myPalette <- colorRampPalette(rev(brewer.pal(11, "Spectral")))
print(ggplot(mydata, aes(x= X, y= Y, colour= Z)) + geom_point(alpha=.5,size = 6) + scale_colour_gradientn(colours = myPalette(100)) + ylim(.1,.4) + xlim(1.5,2) + ggtitle(title))
Run Code Online (Sandbox Code Playgroud)
有没有办法设置这个色标?
Bri*_*ggs 46
我能正确理解吗?您有两个图,其中色标的值被映射到不同图上的不同颜色,因为图中的图不具有相同的值.
library("ggplot2")
library("RColorBrewer")
ggplot(subset(mtcars, am==0), aes(x=wt, y=mpg, colour=carb)) +
geom_point(size=6)
Run Code Online (Sandbox Code Playgroud)
ggplot(subset(mtcars, am==1), aes(x=wt, y=mpg, colour=carb)) +
geom_point(size=6)
Run Code Online (Sandbox Code Playgroud)
在上面一个,深蓝色是1,浅蓝色是4,而在底部一个,深蓝色是(仍然)1,但淡蓝色现在是8.
您可以通过为limits比例提供参数来修复颜色条的末尾; 它应该涵盖数据在任何图中可以采用的整个范围.此外,您可以将此比例分配给变量并将其添加到所有图中(以减少冗余代码,以便定义仅在一个位置而不是在每个图中).
myPalette <- colorRampPalette(rev(brewer.pal(11, "Spectral")))
sc <- scale_colour_gradientn(colours = myPalette(100), limits=c(1, 8))
ggplot(subset(mtcars, am==0), aes(x=wt, y=mpg, colour=carb)) +
geom_point(size=6) + sc
Run Code Online (Sandbox Code Playgroud)
ggplot(subset(mtcars, am==1), aes(x=wt, y=mpg, colour=carb)) +
geom_point(size=6) + sc
Run Code Online (Sandbox Code Playgroud)

可能有更好的方法来做到这一点,但我不知道。同时,您需要确保 的values参数scale_colour_gradientn使得所有绘图的值都映射到正确的颜色。因此,在这里,我制作了两张具有 0-100 之间相同映射的图,但其中一张的值介于 50-150 之间:
mydata <- data.frame(X=runif(20), Y=runif(20), Z=runif(20, 0, 100))
p1 <- ggplot(mydata, aes(x=X, y=Y, colour=Z)) +
geom_point(alpha=.5, size = 6) +
scale_colour_gradientn(colours = myPalette(100), values=seq(0, 100, length.out=100)/100) +
ggtitle("Z: 0 - 100")
Run Code Online (Sandbox Code Playgroud)
这是关键点:
mydata2 <- data.frame(X=runif(20), Y=runif(20), Z=runif(20, 50, 150))
nrm.range.2 <- (range(mydata$Z) - min(mydata2$Z)) / diff(range(mydata2$Z))
nrm.vals <- seq(nrm.range.2[[1]], nrm.range.2[[2]], length.out=100)
Run Code Online (Sandbox Code Playgroud)
现在制作第二个情节。
p2 <- ggplot(mydata2, aes(x=X, y=Y, colour=Z)) +
geom_point(alpha=.5, size = 6) +
scale_colour_gradientn(colours = myPalette(100), values=nrm.vals) +
ggtitle("Z: 50 - 150")
Run Code Online (Sandbox Code Playgroud)

我不知道如何强制在比例尺上显示哪个值范围,但如果您有多个 Z 值范围不重叠的图,您可以创建第三个包含所有范围的虚拟图并使用它。在这里,我故意超出范围以显示重叠的值具有相同的颜色。
小智 5
好的,从前面的示例中获取数据集:
library(ggplot2)
library(RColorBrewer)
library(gridExtra)
library(gtablegridExtra)
#Using the mtcars data set
#Generate plot 1
p1=ggplot(subset(mtcars, am==0), aes(x=wt, y=mpg, colour=carb)) +
geom_point(size=2)+
labs(title="Graph 1")+
scale_color_gradientn(colours=rainbow(5))
#Generate plot 2
p2=ggplot(subset(mtcars, am==1), aes(x=wt, y=mpg, colour=carb)) +
geom_point(size=2)+
labs(title="Graph 2")+
scale_color_gradientn(colours=rainbow(5))
Run Code Online (Sandbox Code Playgroud)
因此,如果我们使用 grid.arrange 将两个图绘制在一起,您应该得到:
grid.arrange(arrangeGrob(p1,
p2,
nrow = 1))
Run Code Online (Sandbox Code Playgroud)
因此,我们希望两个图表都具有相同的范围,并且只绘制其中一个 colos sacles。您需要做的是首先定义色标的范围。在这个例子中,让我们这样做:
summary(mtcars$carb)
>
Min. 1st Qu. Median Mean 3rd Qu. Max.
1.000 2.000 2.000 2.812 4.000 8.000
Run Code Online (Sandbox Code Playgroud)
所以我们知道色标应该是从 1 到 8。我们将此范围定义为col.range,然后用它来指定每个图中的范围:
#Define color range
col.range=c(1,8)
#Generate plot 1
p1=ggplot(subset(mtcars, am==0), aes(x=wt, y=mpg, colour=carb)) +
geom_point(size=2)+
labs(title="Graph 1")+
scale_color_gradientn(colours=rainbow(5),limits=col.range) #look here
#Generate plot 2
p2=ggplot(subset(mtcars, am==1), aes(x=wt, y=mpg, colour=carb)) +
geom_point(size=2)+
labs(title="Graph 2")+
scale_color_gradientn(colours=rainbow(5),limits=col.range) #look here
#Plot both graphs together
grid.arrange(arrangeGrob(p1,
p2,
nrow = 1))
Run Code Online (Sandbox Code Playgroud)
这将为您提供下图。现在两张图的颜色是可以比较的。
然而,重复的颜色比例是多余的,所以我们只想使用一个。
因此,为了获得漂亮的最终图表,我们可以使用之前定义的相同的 p1 和 p2 图,我们只是在 grid.arrange 函数上指定为:
#Create al element that will represent your color scale:
color.legend=gtable_filter(ggplotGrob(p1),"guide-box")
#We hide de color scale on each individual graph
#Then we insert the color scale and we adjust the ratio of it with the graphs
#For this we define the theme() as follows:
grid.arrange(arrangeGrob(p1+theme(legend.position="none"),
p2+theme(legend.position="none"),
nrow = 1), #Here we have just remove the color scale
color.scale, #We inserted the color scale.
nrow=1, #We put the color scale to the right of the graph
widths=c(20,1) #With this we make the color scale much narrower
Run Code Online (Sandbox Code Playgroud)
这样你就完成了,得到下图:
希望有用!!!!
请评价!!!!<3