在 ggplot2 中添加手动渐变图例
Add manual gradient legend in ggplot2
我正在用 ggplot2
制作 "bullseye" 或 "dart board" 情节。我想问一下是否有办法为我正在制作的图形手动添加渐变图例,或者是否有办法修改我的程序以添加该图例。
这是一个可以使用的可重现数据集:
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()
下面是这段代码生成的图 — 基本上是一组具有所需颜色填充的同心环:
我想在此图中添加一个图例条,显示从起始颜色到结束颜色的(线性)渐变,标签使用 df$f
的 min/max。
我可以从 df
手动提供开始和结束颜色 — 或者从单独的 colorRampPalette
对象(未显示)的第一个和最后一个条目 — 或者从 colorRampPalette
对象提供插值颜色。我只是不知道如何生成与主图分开的图例对象。
有没有办法手动构建这样的对象并将其附加到该图上?
我尝试的几件事是探索 guide_colourbar()
object 和 scale_colour_gradientn()
对象,但我无法使用这些实体在我的情节中得到任何东西。有没有办法在这里使用它们?
获得漂亮图例的最简单方法是,您需要将事物实际映射到您的数据,例如 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())
然而,图例有待改进,因为它不是连续的,所以它的顺序是错误的,它显示的是颜色代码而不是标签的值。此外,不同的颜色在它们的映射值中不是等距的。
方法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')
我正在用 ggplot2
制作 "bullseye" 或 "dart board" 情节。我想问一下是否有办法为我正在制作的图形手动添加渐变图例,或者是否有办法修改我的程序以添加该图例。
这是一个可以使用的可重现数据集:
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()
下面是这段代码生成的图 — 基本上是一组具有所需颜色填充的同心环:
我想在此图中添加一个图例条,显示从起始颜色到结束颜色的(线性)渐变,标签使用 df$f
的 min/max。
我可以从 df
手动提供开始和结束颜色 — 或者从单独的 colorRampPalette
对象(未显示)的第一个和最后一个条目 — 或者从 colorRampPalette
对象提供插值颜色。我只是不知道如何生成与主图分开的图例对象。
有没有办法手动构建这样的对象并将其附加到该图上?
我尝试的几件事是探索 guide_colourbar()
object 和 scale_colour_gradientn()
对象,但我无法使用这些实体在我的情节中得到任何东西。有没有办法在这里使用它们?
获得漂亮图例的最简单方法是,您需要将事物实际映射到您的数据,例如 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())
然而,图例有待改进,因为它不是连续的,所以它的顺序是错误的,它显示的是颜色代码而不是标签的值。此外,不同的颜色在它们的映射值中不是等距的。
方法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')