天道酬勤,学无止境

`fill` 比例未显示在图例中(`fill` scale is not shown in the legend)

问题

这是我的虚拟代码:

set.seed(1)
df <- data.frame(xx=sample(10,6), 
                 yy=sample(10,6), 
                 type2=c('a','b','a','a','b','b'),
                 type3=c('A','C','B','A','B','C')
                 )
ggplot(data=df, mapping = aes(x=xx, y=yy)) + 
geom_point(aes(shape=type3, fill=type2), size=5) +
  scale_shape_manual(values=c(24,25,21)) +
  scale_fill_manual(values=c('green', 'red'))

结果图有一个图例,但它的“type2”部分不反映fill值的比例 - 是设计使然吗?

样地

回答1

我知道这是一个旧线程,但我遇到了这个确切的问题,并想在这里发布给像我这样的其他人。 虽然接受的答案有效,但风险较小、更清洁的方法是:

library(ggplot2)
ggplot(data=df, mapping = aes(x=xx, y=yy)) + 
  geom_point(aes(shape=type3, fill=type2), size=5) +
  scale_shape_manual(values=c(24,25,21)) +
  scale_fill_manual(values=c(a='green',b='red'))+
  guides(fill=guide_legend(override.aes=list(shape=21)))

关键是将图例中的形状更改为可以“填充”的形状之一。

回答2

这是一个不同的解决方法。

library(ggplot2)
ggplot(data=df, mapping = aes(x=xx, y=yy)) + 
  geom_point(aes(shape=type3, fill=type2), size=5) +
  scale_shape_manual(values=c(24,25,21)) +
  scale_fill_manual(values=c(a='green',b='red'))+
  guides(fill=guide_legend(override.aes=list(colour=c(a="green",b="red"))))

使用guide_legend(...)override_aes是一种影响指南(图例)外观的方法。 黑客是在这里我们用它们最初应该具有的颜色“覆盖”指南中的填充颜色。

回答3

我玩弄数据并提出了这个想法。 我首先在第一个geom_point分配了形状。 然后,我使形状为空。 这样,轮廓保持黑色。 第三,我手动分配了特定的形状。 最后,我填写了符号。

ggplot(data=df, aes(x=xx, y=yy)) +
geom_point(aes(shape = type3), size = 5.1) + # Plot with three types of shape first
scale_shape(solid = FALSE) + # Make the shapes empty
scale_shape_manual(values=c(24,25,21)) + # Assign specific types of shape
geom_point(aes(color = type2, fill = type2, shape = type3), size = 4.5)

在此处输入图片说明

回答4

我不确定你想要的是否像这样?

ggplot(df,aes(x=xx,y=yy))+
  geom_point(aes(shape=type3,color=type2,fill=type2),size=5)+
  scale_shape_manual(values=c(24,25,21))

ggplot 填充颜色形状

标签

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • 用文本:ggplot2标记比例尺填充梯度图例的最小值和最大值(Label minimum and maximum of scale fill gradient legend with text: ggplot2)
    问题 我在ggplot2中创建了一个使用scale_fill_gradientn 。 我想在比例图例的最小和最大处添加文本。 例如,图例最小显示为“ Minimum”,图例最大显示为“ Maximum”。 有些帖子使用离散填充,并使用数字而不是文本添加标签(例如,此处),但是我不确定如何在scale_fill_gradientn使用labels功能以仅在最小和最大处插入文本。 目前,我容易出错: Error in scale_labels.continuous(scale, breaks) : Breaks and labels are different lengths 这种文本标签在ggplot2中是否可以用于这种比例/填充类型? # The example code here produces an plot for illustrative purposes only. # create data frame, from ggplot2 documentation df <- expand.grid(x = 0:5, y = 0:5) df$z <- runif(nrow(df)) #plot ggplot(df, aes(x, y, fill = z)) + geom_raster() + scale_fill_gradientn(colours=topo.colors
  • 多面ggplot的不同图例和填充颜色?(Different legends and fill colours for facetted ggplot?)
    问题 抱歉,我的问题未包含任何示例数据。 我找不到轻松生成示例形状文件的方法。 希望有经验的ggplot用户可以从下面的描述中看到我想要做的事情。 我有: 一个data.frame X,其中包含有关示例图的信息( plotid , var1 , var2 , var3 , var4 …) 具有样例空间信息的多边形shapefile Y shape文件的进口Y (与maptools )和fortify ING作为data.frame Z ( ggplot2 )工作正常。 melt X melt为X_melted效果也很好。 merge Z和X_melted merge到mapdf中也可以。 这意味着现在我们有了一个长格式的data.frame ,其中包含空间信息以及var1 , var2 , var3 ,... 现在,我要像这样绘制此数据框: pl1 <- ggplot(mapdf,aes(long,lat),group=group) pl1 <- pl1 + geom_polygon(aes(group=group,fill=value),colour="black") pl1 <- pl1 + facet_grid(variable ~ .) pl1 <- pl1 + coord_equal(ratio = 1) pl1 结果是一个很好的绘图,每个变量有一个面板。
  • 线和条的组合几何:如何生成适当的图例?(Combined line & bar geoms: How to generate proper legend?)
    问题 d2的图例看起来不错; 对于d1 ,我只想显示白色/透明backgounnd的水平线。 df = data.frame( Date = c("2012-11-30", "2012-12-03", "2012-12-04"), d1 = c(9, 5, 11), d2 = c(4, 6, 3) ) ggplot(df, aes(Date)) + geom_bar(aes(y = d2, color = "d2"), stat="identity", fill = "red") + geom_line(aes(y = d1, group = 1, color = "d1")) + scale_colour_manual("", values=c("d1" = "blue", "d2" = "red")) 回答1 这不是一个很好的解决方案,但至少可以带来一些结果。 我在geom_bar()添加了aes(fill="d2") geom_bar()并删除了fill="red" 。 然后,我为线条和线条添加了单独的比例尺。 然后在theme()从图例条目中删除了灰色背景。 为了确保图例中的d1在scale_colour_manual(" ") d2之前显示,引号之间应有多余的空格(“较长”的名称)。 为了使图例键保持一行,将legend.box="horizontal"添加到theme(
  • 如何将颜色和尺寸的比例尺合并为一个图例?(How to combine scales for colour and size into one legend?)
    问题 我想知道如何在大小和颜色来自同一数据的绘图中对scale_size() {ggplot2}中的size_scale进行着色。 例子: library(ggplot2) df<-as.data.frame(cbind(rep(1:10,10), rep(1:10,each=10), rnorm(100))) ggplot(df,aes(V1,V2))+ geom_point(aes(colour=V3,size=V3))+ scale_colour_gradient(low="grey", high="black")+ scale_size(range=c(1,10)) 如您所见, V3的颜色和数据点的大小相同。 如何将颜色渐变合并到尺寸比例中(除非在Illustrator等程序中手动进行此操作)? 谢谢! 回答1 使用ggplot2的guides()函数。 在这种情况下: ggplot(df,aes(V1,V2))+ geom_point(aes(colour=V3,size=V3))+ scale_colour_gradient(low="grey", high="black")+ scale_size(range=c(1,10)) + guides(color=guide_legend(), size = guide_legend()) ggplot2将尝试为您集成秤。
  • ggplot 中多次填充的图例(Legends for multiple fills in ggplot)
    问题 我是ggplot2的初学者。 因此,如果这个问题听起来太基本,我深表歉意。 我很感激任何指导。 我在这上面花了 4 个小时,并查看了这个 SO 线程 R:Multiple Layer ggplot 的自定义图例以获得指导,但最终无处可去。 目标:我希望能够将图例应用于用于不同图层的不同填充颜色。 我做这个例子只是为了测试我对应用概念ggplot2概念的理解。 另外,我不想改变形状类型; 改变填充颜色很好——通过“填充”我并不是说我们可以改变“颜色”。 所以,我将不胜感激,如果你能在我的工作纠正我的错误。 尝试 1:这是没有手动设置任何颜色的基本代码。 ggplot(mtcars, aes(disp,mpg)) + geom_point(aes(fill = factor(vs)),shape = 23, size = 8, alpha = 0.4) + geom_point (aes(fill = factor(cyl)),shape = 21, size = 2) + geom_rect(aes(xmin = min(disp)-5, ymax = max(mpg) + 2,fill = "cyan"), xmax = mean(range(mtcars$disp)),ymin = 25, alpha = 0.02) ##region for high mpg 输出如下所示
  • 如何使用 geom_vline 和 geom_histogram r ggplot2 从填充比例图例中删除线(how to remove line from fill scale legend using geom_vline and geom_histogram r ggplot2)
    问题 基础知识:使用 R 统计软件、ggplot2、geom_vline 和 geom_histogram 将一些数据可视化。 问题在于图例键。 我试图从一些随机模拟中绘制一对直方图,并在该图的顶部绘制几条线代表确定性模拟的结果。 我已经绘制了数据,但是直方图的图例键中间有一条不必要的黑线。 你能帮我去掉那些黑线吗? 一些重现问题的示例代码在这里: df1 <- data.frame(cond = factor( rep(c("A","B"), each=200) ), rating = c(rnorm(200),rnorm(200, mean=.8))) df2 <- data.frame(x=c(.5,1),cond=factor(c("A","B"))) ggplot(df1, aes(x=rating, fill=cond)) + geom_histogram(binwidth=.5, position="dodge") + geom_vline(data=df2,aes(xintercept=x,linetype=factor(cond)), show_guide=TRUE) + labs(fill='Stochastic',linetype='Deterministic') 编辑:添加图像 干杯,瑞安 回答1 一种解决方法是更改geom_histogram()和geom
  • 带有 geom_line 和 geom_ribbon 的图例(Legend with geom_line and geom_ribbon)
    问题 我正在创建一个图形,周围有一条线和置信带。 要做到这一点,我同时使用geom_line和geom_ribbon在ggplot2在河的问题是如何应对的传说。 在其中添加了斜杠,经过一段时间的谷歌搜索后,我明白这是一个常见问题。 我发现的大多数解决方案都是针对条形图的(例如 ggplot 食谱)。 我也找到了抑制它的解决方案,但这对我没有用。 下面我有三个图显示了这个问题。 首先,当我只绘制线条时,它看起来不错。 然后,当我添加绘图的功能区部分时,会添加斜线。 第三个情节是我想要的样子(显然,斜线除外)。 我如何实现这一目标? 编辑:要清楚,我想要的是下图中的内容(我使用 MS Paint 修复了它): library(ggplot2) library(gridExtra) set.seed(1) y <- sin(seq(1, 2*pi, length.out = 100)) x <- 1:100 plotdata <- data.frame(x=x, y=y, lower = (y+runif(100, -1, -0.5)), upper = (y+runif(100, 0.5, 1))) h1 <- ggplot(plotdata) + geom_line(aes(y=y, x=x, colour = "sin")) h2 <- h1 + geom_ribbon(aes
  • 一个图中两个图例之间的距离较小(例如颜色和大小比例)(Smaller gap between two legends in one plot (e.g. color and size scale))
    问题 如何缩小一个绘图中两个参考线之间的距离。 在下面的示例中,这两个指南来自颜色和大小比例,我想更改两者之间的间距,以使标题“大小”恰好位于图例点的下方1。在这个例子中是有意义的,但是在我的实际应用中却可以。 df=data.frame(x=rnorm(100),y=rnorm(100),color=factor(rbinom(100,1,0.5)),size=runif(100)) ggplot(df,aes(x=x,y=y,color=color,size=size)) + geom_point() 编辑:这是情节。 我想缩小由绿线和箭头突出显示的间隙。 回答1 我试图玩以自定义legend或guide参数,但找不到解决方案。 我希望使用ggplot2设置提供解决方案。 这里有2个基于gtable和grid包的解决方案。 对于gtable解决方案,此问题启发了代码。 library(gtable) # Data transformation data <- ggplot_build(p) gtable <- ggplot_gtable(data) # Determining index of legends table lbox <- which(sapply(gtable$grobs, paste) == "gtable[guide-box]") # changing
  • 在 geom_tile 的颜色条指南上调整大小/手动输入中断并替换 y 轴标签(Resize/manually enter breaks on colorbar guide of geom_tile AND replace y-axis labels)
    问题 我正在重新审视大约一年前遇到的这个问题。 我希望我的“颜色条”指南能够有效地显示在对数刻度上,以便在查看时得出的结论是越来越暗的蓝色值反映了更大的意义。 使用以下代码,我生成以下图像: pz <- ggplot(dat.m, aes(x=variable,y=Category)) + geom_tile(aes(fill=value)) + xlab(NULL) + ylab(NULL) + scale_fill_gradientn(colours=c("#000066","#0000FF","#DDDDDD","white"), values=c(0,0.05,0.050000000000001,1.0), breaks=c(0, 0.000001, 0.01, 0.05, 1), guide = "colourbar") + theme_bw()+ theme(panel.background = element_blank(), panel.border = element_blank(), axis.ticks.x = element_blank(), axis.ticks.y = element_blank()) + theme(legend.position="top", legend.text = element_text(angle=45), axis
  • 当不存在任何值时,强制ggplot图例显示所有类别(Force ggplot legend to show all categories when no values are present [duplicate])
    问题 这个问题已经在这里有了答案: ggplot2 0.9.0是否会自动从图例中删除未使用的因子水平? (2个答案) 5年前关闭。 我试图强制ggplot显示图例并固定一个因数的颜色,即使该范围内不存在任何值也是如此。 在下面的可重现示例中,图1在变量X1的每个范围内至少具有一个值,并根据需要进行绘制。 每个图例标签均已绘制并与所需颜色匹配。 在示例2中,变量Y1在创建的每个范围中都没有值。 因此,该图仅显示前4个图例标签,并使用前4种颜色。 有没有一种方法可以绘制此图,从而强制ggplot显示所有八个图例标签并固定颜色,从而使cat1值始终为红色,cat2值始终为蓝色,依此类推。 我尝试了所有我能想到的一切,但都没有成功。 -可复制的示例- set.seed(45678) dat <- data.frame(Row = rep(x = LETTERS[1:5], times = 10), Col = rep(x = LETTERS[1:10], each = 5), Y = rnorm(n = 50, mean = 0, sd = 0.5), X = rnorm(n = 50, mean = 0, sd = 2)) library(ggplot2) library(RColorBrewer) library(dplyr) dat <- dat %>% mutate(Y1 =
  • ggplot2图例未显示添加系列的标签(`ggplot2` legend not showing label for added series)
    问题 在以下具有两个系列的ggplot2 ,即美国GDP和移动平均线,图例未显示移动平均线系列: require(xts);require(data.table);require(ggplot2);require(ggthemes) # US GDP quarterly data data <- structure(list(ShortName = c("US GDP QoQ (Annualised)", "US GDP QoQ (Annualised)","US GDP QoQ (Annualised)", "US GDP QoQ (Annualised)", "US GDP QoQ (Annualised)", "US GDP QoQ (Annualised)", "US GDP QoQ (Annualised)", "US GDP QoQ (Annualised)", "US GDP QoQ (Annualised)", "US GDP QoQ (Annualised)", "US GDP QoQ (Annualised)", "US GDP QoQ (Annualised)", "US GDP QoQ (Annualised)", "US GDP QoQ (Annualised)","US GDP QoQ (Annualised)", "US GDP QoQ
  • 为绘图制作 2D 图例 - 双变量等值线图(Make a 2D legend for a plot - bi-variate choropleth maps)
    问题 我一直在玩双变量 choropleth 地图,并且一直在研究如何创建类似于 Joshua Stevens 在这里显示的那个的 2d 图例: 为了说明这一挑战,我们不需要使用地图。 下面的代码就足够了: #test desired legend appearance library(ggplot2) library(reshape2) #use color scheme shown here http://www.joshuastevens.net/cartography/make-a-bivariate-choropleth-map/ bvColors=c("#be64ac","#8c62aa","#3b4994","#dfb0d6","#a5add3","#5698b9","#e8e8e8","#ace4e4","#5ac8c8") legendGoal=melt(matrix(1:9,nrow=3)) test<-ggplot(legendGoal, aes(Var1,Var2))+ geom_tile(aes(fill = as.factor(value))) test<- test + scale_fill_manual(name="Var1 vs Var2",values=bvColors,drop=FALSE) test 它创建了一个看起来像我想要的图例的图
  • 更改复合图例标题(Change composite legend title)
    问题 如果我有以下数据并使用ggplot2绘制它,我会得到: a <-c(0.3,0.3,0.3,0.3,0.3) b <-c(1:5,0.9,0.9,0.9,0.9,0.9) c <-c(1:5,0.5,0.5,0.5,0.5,0.5) z <-rep(1:5,5) df <- data.frame(y=c(a,b,c),x=c(z),line=c(rep("1",5), rep("2",5),rep("3",5),rep("2",5),rep("3",5))) library(ggplot2) a <- ggplot(df,aes(x=x,y=y,fill=line,shape=line,group=line)) + geom_line(aes(linetype=line),size=1) + scale_linetype_manual(values=c("dashed","solid", "dotdash")) + geom_point(size=3) + scale_shape_manual(values=c(25,23,21,25,23)) + scale_fill_manual(values=c("red", "blue", "yellow","red", "blue")) 如果我想指定图例的标题,我可以做很多事情,比如 a + labs(shape = "MY
  • 在连续图的ggplot图例中为NA值添加一个框(Add a box for the NA values to the ggplot legend for a continous map)
    问题 我有一张带有图例渐变的地图,我想为NA值添加一个框。 我的问题确实与此和这一问题相似。 我也已经阅读了该主题,但是我找不到某个地方的“不错”的解决方案,或者也许没有解决方案? 这是一个可重现的示例: library(ggplot2) map <- map_data("world") map$value <- setNames(sample(-50:50, length(unique(map$region)), TRUE), unique(map$region))[map$region] map[map$region == "Russia", "value"] <- NA ggplot() + geom_polygon(data = map, aes(long, lat, group = group, fill = value)) + scale_fill_gradient2(low = "brown3", mid = "cornsilk1", high = "turquoise4", limits = c(-50, 50), na.value = "black") 因此,我想为俄罗斯的NA值添加一个黑匣子。 我知道,我可以用数字替换NA,所以它将出现在渐变中,我想,我可以编写以下解决方法,但是所有这些解决方法对于我来说似乎都不是一个很好的解决方案,我也想避免“毫无意义的”警告
  • 在ggplot2中,如何添加其他图例?(In ggplot2, how can I add additional legend?)
    问题 我正在尝试使用来自单独数据帧的数据在ggplot2构建映射。 library(maptools) xx <- readShapePoly(system.file("shapes/sids.shp", package="maptools")[1], IDvar="FIPSNO", proj4string=CRS("+proj=longlat +ellps=clrk66")) xx.sub1 <- subset(xx, xx$FIPSNO < 37010) xx.sub2 <- subset(xx, xx$FIPSNO > 37010) xx.sub1@data$id <- rownames(xx.sub1@data) xx.sub1.points <- fortify(xx.sub1, region="id") xx.sub1.df = plyr::join(xx.sub1.points, xx.sub1@data, by="id") xx.sub2@data$id <- rownames(xx.sub2@data) xx.sub2.points <- fortify(xx.sub2, region="id") xx.sub2.df = plyr::join(xx.sub2.points, xx.sub2@data, by="id") ggplot(xx.sub2.df) +
  • 如何在双Y轴ggplot上显示图例(how to show a legend on dual y-axis ggplot)
    问题 我正在尝试使用ggplot组成双Y轴图表。 首先,我要说的是,我不是要就这样做是否是一种好的做法进行讨论。 我发现它们在查看基于时间的数据以识别2个离散变量的趋势时特别有用。 在我看来,对此的进一步讨论更适合进行交叉验证。 Kohske提供了一个很好的示例,说明了如何做到这一点,到目前为止,我已经取得了巨大的成就。 但是,我要尽力为两个y轴添加一个图例。 我在这里和这里也都看到过类似的问题,但似乎都没有解决包含图例的问题。 我有一个使用ggplot中的diamonds数据集的可复制示例。 数据 library(ggplot2) library(gtable) library(grid) library(data.table) library(scales) grid.newpage() dt.diamonds <- as.data.table(diamonds) d1 <- dt.diamonds[,list(revenue = sum(price), stones = length(price)), by=clarity] setkey(d1, clarity) 图表 p1 <- ggplot(d1, aes(x=clarity,y=revenue, fill="#4B92DB")) + geom_bar(stat="identity") + labs(x="clarity
  • 如何反转图例(标签和颜色)如此高的价值开始楼下?(How to reverse legend (labels and color) so high value starts downstairs?)
    问题 什么是反转图例标签顺序的最佳方法,因此 7 在下而 1 在楼上? df$day <- as.numeric(df3$day) blues <- colorRampPalette(c('#132B43', '#56B1F7')) p4 <- ggplot(subset(df,feedback==1&stp>20), aes(x=correct, fill=day, colour=day)) + geom_histogram(colour="black", binwidth=10) + facet_grid(day ~ .) + ggtitle("Over-pronation histogram") + ylab("Count (150s period)") + xlab("% Steps in over-pronation") +guide_legend(reverse = false) 回答1 你的代码很奇怪,用false而不是FALSE并且错误地放置了guide_legend 。 正确的用法是(@Harpal 对此给出了提示): ggplot(data.frame(x=1:4, y=4:1, col=factor(1:4)), aes(x=x, y=y, col=col)) + geom_point(size=10) ggplot(data.frame(x=1:4, y=4
  • 删除图例ggplot 2.2(Remove legend ggplot 2.2)
    问题 我正在尝试保留一层(平滑)的图例,并删除另一层(点)的图例。 我试图用guides(colour = FALSE)和geom_point(aes(color = vs), show.legend = FALSE)关闭图例。 编辑:由于此问题及其答案很流行,因此似乎出现了一个可重现的示例: library(ggplot2) ggplot(data = mtcars, aes(x = mpg, y = disp, group = gear)) + geom_point(aes(color = vs)) + geom_point(aes(shape = factor(cyl))) + geom_line(aes(linetype = factor(gear))) + geom_smooth(aes(fill = factor(gear), color = gear)) + theme_bw() 回答1 来自r cookbook,其中bp是您的ggplot: 删除图例以达到特定的美感(填充): bp + guides(fill=FALSE) 指定比例时也可以完成此操作: bp + scale_fill_discrete(guide=FALSE) 这将删除所有图例: bp + theme(legend.position="none") 回答2 对此可能有另一种解决方案: 您的代码是:
  • 如何在ggplot中更改图例标题(How to change legend title in ggplot)
    问题 我有下面的情节如下。 它是使用以下命令创建的: library(ggplot2) df <- data.frame(cond = factor(rep(c("A", "B"), each = 200)), rating = c(rnorm(200), rnorm(200, mean=.8))) ggplot(df, aes(x=rating, fill=cond)) + geom_density(alpha = .3) + xlab("NEW RATING TITLE") + ylab("NEW DENSITY TITLE") 现在,我接下来要做的是将图例标题从cond修改为NEW LEGEND TITLE 。 因此,我要做的只是添加以下行,然后添加上述代码的末尾: +labs(colour="NEW LEGEND TITLE") 但这是行不通的。 什么是正确的方法? 回答1 这应该工作: p <- ggplot(df, aes(x=rating, fill=cond)) + geom_density(alpha=.3) + xlab("NEW RATING TITLE") + ylab("NEW DENSITY TITLE") p <- p + guides(fill=guide_legend(title="New Legend Title")) (或替代) p +
  • R 将图例和直接标签添加到 ggplot2 等高线图(R adding legend and directlabels to ggplot2 contour plot)
    问题 我有一个栅格地图,我想使用 ggplot2 使用连续比例尺绘制并在其上标记等值线。 为此,我正在使用 directlabels 包,并且接近获得我想要的结果,但我无法在同一张地图上同时获得图例和带标签的等值线 以下代码重现了我的问题: install.packages(c('ggplot2', 'directlabels')) library('ggplot2') library('directlabels') df <- expand.grid(x=1:100, y=1:100) df$z <- df$x * df$y # Plot 1: this plot is fine but without contours p <- ggplot(aes(x=x, y=y, z=z), data = df) + geom_raster(data=df, aes(fill=z)) + scale_fill_gradient(limits=range(df$z), high = 'white', low = 'red') p # Plot 2: This plot adds the isolines but no labels and it also adds a second legend for level which I don't want p <- p + geom