2017-03-02 156 views
0

我正在制作一个带有ggplot2的“靶心”或“飞镖板”图。我想问问是否有办法为我正在创建的图形手动添加渐变图例,或者是否有方法修改我的过程以添加该图例。在ggplot2中添加手动渐变图例

这是一个可重复的数据集的工作:

step <- 0.1 
frac <- seq(0, 1, step) 
df <- data.frame(l=levels(cut(0, breaks=frac)), o=frac[1:length(frac)-1], f=c(0.000, 0.028, 0.165, 0.151, 0.149, 0.129, 0.138, 0.060, 0.090, 0.088), cols=c('#0000FF','#4343FF','#FF4343','#FF6969','#FF7070','#FFA4A4','#FF8E8E','#9D9DFF','#F0F0FF','#E8E8FF')) 

这里是什么样子:

> df 
df 
      l o  f cols 
1 (0,0.1] 0.0 0.000 #0000FF 
2 (0.1,0.2] 0.1 0.028 #4343FF 
3 (0.2,0.3] 0.2 0.165 #FF4343 
4 (0.3,0.4] 0.3 0.151 #FF6969 
5 (0.4,0.5] 0.4 0.149 #FF7070 
6 (0.5,0.6] 0.5 0.129 #FFA4A4 
7 (0.6,0.7] 0.6 0.138 #FF8E8E 
8 (0.7,0.8] 0.7 0.060 #9D9DFF 
9 (0.8,0.9] 0.8 0.090 #F0F0FF 
10 (0.9,1] 0.9 0.088 #E8E8FF 

下面是可重复的代码来生成的情节:

library(ggplot2) 
#pdf("test.pdf", width=8, height=8) 
p <- ggplot() + ylim(0, 1) + geom_rect(aes(xmin=-1, ymin=df$o, xmax=1, ymax=df$o+step), fill=df$cols) + coord_polar() + theme(axis.title.x=element_blank(), axis.text.x=element_blank(), axis.ticks.x=element_blank()) 
print(p) 
#dev.off() 

下面是这段代码生成的情节 - 基本上是一组具有所需颜色填充的同心环:

Bullseye

我想图例栏添加到该图显示从起始颜色结束颜色的(线性)梯度,在使用的df$f最小/最大的标签。

我可以从df手动提供的开始和结束的颜色 - 或从单独的colorRampPalette物体(未示出)的第一和最后一个条目 - 或提供从colorRampPalette对象的颜色阵列,以提供经内插的色彩。我只是不知道如何生成与主图分离的图例对象。

有没有办法手动构建和追加这样的对象到这个图上?

我尝试过的几件事是探索guide_colourbar() objectscale_colour_gradientn()对象,但我无法使用这些实体获得任何东西进入我的情节。有没有办法在这里使用它们?

回答

3

要获得一个很好的图例最简单的方法,您需要实际将事物映射到您的数据,如ggplot背后的设计意图。

方法1,地图fill你的颜色变量,并使用scale_identity使用精确的颜色提供:

ggplot(df) + 
    ylim(0, 1) + 
    geom_rect(aes(xmin = -1, ymin = o, xmax = 1, ymax = o + step, fill = cols)) + 
    coord_polar() + 
    scale_fill_identity(guide = guide_legend()) 

enter image description here

图例叶然而,应当希望的,因为它是不连续的,它会以错误的方式排列,并显示颜色代码而不是标签的值。此外,不同颜色的映射值不是等距的。

方法2,您可以使用实际的连续比例(您没有提供)以获得合适的颜色条。这里有一个你可以尝试的尝试,我让ggplot从你的极端值通过白色创建一个连续的规模。

ggplot(df) + 
    ylim(0, 1) + 
    geom_rect(aes(xmin = -1, ymin = o, xmax = 1, ymax = o + step, fill = f)) + 
    coord_polar() + 
    scale_fill_gradient2(midpoint = mean(range(df$f)), low = '#0000FF', high = '#FF4343') 

enter image description here

+1

我还在学习ggplot让我欣赏的那种帮助。 –