如何在ggplot2中设置固定的连续颜色值

Rod*_*phe 21 r ggplot2

我正在绘制大量的图形,我希望它们都具有相同的色标,以便我可以相互比较.这是我的代码:

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)

在此输入图像描述


Bro*_*ieG 5

可能有更好的方法来做到这一点,但我不知道。同时,您需要确保 的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