- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在ggplot2
图中,我将geom_line
和geom_point
与geom_bar
组合在一起,并且在合并时遇到问题将图例放入一个盒子中。
基本图的代码如下。使用的数据更进一步。
# Packages
library(ggplot2)
library(scales)
# Basic Plot
ggplot(data = df1, aes(x = Year, y = value, group = variable,
colour = variable, shape = variable)) +
geom_line() +
geom_point(size = 3) +
geom_bar(data = df2, aes(x = Year, y = value, fill = variable),
stat = "identity", alpha = 0.8) +
ylab("Current Account Transactions (Billion $)") +
xlab(NULL) +
theme_bw(14) +
scale_x_discrete(breaks = seq(1999, 2013, by = 2)) +
scale_y_continuous(labels = dollar, limits = c(-1, 4),
breaks = seq(-1, 4, by = .5)) +
geom_hline(yintercept = 0) +
theme(legend.key = element_blank(),
legend.background = element_rect(colour = 'black', fill = 'white'),
legend.position = "top", legend.title = element_blank()) +
guides(col = guide_legend(ncol = 1), fill = NULL, colour = NULL)
我的目标是将传奇融合在一起。由于某种原因,“经常账户余额”出现在顶部图例中(我不明白为什么),而“导出”和“进口”图例则因黑色背景和缺失形状而困惑。
如果我将fill
放在aes
之外,我可以获得“导入”和“导出”的图例,以正确的形状和颜色显示,并且没有黑色背景,但随后我丢失了“当前帐户余额”的 fill
图例。
我之前使用过并取得了一些成功的技巧,即使用 scale_colour_manual
、scale_shape_manual
和 scale_fill_manual
(也许还有 scale_alpha
)在这里似乎不起作用。让它发挥作用就好了。但请注意,据我所知,使用此技巧时,必须手动指定颜色、形状和填充,但我实际上不想这样做,因为我对默认的颜色/形状/填充非常满意。
我通常会做这样的事情,但它不起作用:
library(RColorBrewer)
cols <- colorRampPalette(brewer.pal(9, "Set1"))(3)
last_plot() + scale_colour_manual(name = "legend", values = cols) +
scale_shape_manual(name = "legend", values = c(0,2,1)) +
scale_fill_manual(name = "legend", values = "darkred")
在上面我没有指定标签,因为在我的问题中我将处理大量数据,手动指定标签是不切实际的。我希望 ggplot2 使用默认标签。出于同样的原因,我想使用默认的颜色/形状/填充。
其他地方也报告了类似的困难,例如这里 Construct a manual legend for a complicated plot ,但我还没有设法应用解决方案来解决我的问题。
有什么想法吗?
# Data
df1 <- structure(list(Year = structure(c(1L, 2L, 3L, 4L, 5L, 6L, 7L,
8L, 9L, 10L, 11L, 12L, 13L, 14L, 15L, 1L, 2L, 3L, 4L, 5L, 6L,
7L, 8L, 9L, 10L, 11L, 12L, 13L, 14L, 15L), .Label = c("1999",
"2000", "2001", "2002", "2003", "2004", "2005", "2006", "2007",
"2008", "2009", "2010", "2011", "2012", "2013"), class = "factor"),
variable = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L,
1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L,
2L, 2L, 2L, 2L, 2L, 2L), .Label = c("Exports of goods and services",
"Imports of goods and services"), class = "factor"), value = c(1.304557,
1.471532, 1.345165, 1.31879, 1.409053, 1.642291, 1.895983,
2.222124, 2.569492, 2.751949, 2.285922, 2.630799, 2.987571,
3.08526, 3.178744, 1.600087, 1.882288, 1.740493, 1.776877,
1.930395, 2.276059, 2.641418, 3.028851, 3.288135, 3.43859,
2.666714, 3.074729, 3.446914, 3.546009, 3.578998)), .Names = c("Year",
"variable", "value"), row.names = c(NA, -30L), class = "data.frame")
df2 <- structure(list(Year = structure(1:15, .Label = c("1999", "2000 ",
"2001", "2002 ", "2003", "2004 ", "2005", "2006 ", "2007", "2008 ",
"2009", "2010 ", "2011", "2012 ", "2013"), class = "factor"),
variable = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L,
1L, 1L, 1L, 1L, 1L, 1L), .Label = "Balance on current account", class = "factor"),
value = c(-0.29553, -0.410756, -0.395328, -0.458087, -0.521342,
-0.633768, -0.745434, -0.806726, -0.718643, -0.686641, -0.380792,
-0.44393, -0.459344, -0.460749, -0.400254)), .Names = c("Year",
"variable", "value"), row.names = c(NA, -15L), class = "data.frame")
编辑
在发布我的问题并阅读斯科特的回答后,我尝试了另一种方法。它在某些方面更接近期望的结果,但在其他方面更接近。这个想法是将数据帧合并为单个数据帧,并将颜色/形状/填充传递给第一个 ggplot 调用内的 aes 。这样做的问题是我在图例上得到了不想要的“斜线”。我无法在不删除所有颜色的情况下删除斜线。我立即提到的这种方法的另一个问题是,我需要手动指定一堆东西,而我希望尽可能保留默认值。
df <- rbind(df1, df2)
ggplot(data = df, aes(x = Year, y = value, group = variable, colour = variable,
shape = variable, fill = variable)) +
geom_line(data = subset(df, variable %in% c("Exports of goods and services", "Imports of goods and services"))) +
geom_point(data = subset(df, variable %in% c("Exports of goods and services", "Imports of goods and services")), size = 3) +
geom_bar(data = subset(df, variable %in% c("Balance on current account")), aes(x = Year, y = value, fill = variable),
stat = "identity", alpha = 0.8)
cols <- c(NA, "darkgreen", "darkblue")
last_plot() + scale_colour_manual(name = "legend", values = cols) +
scale_shape_manual(name = "legend", values = c(32, 15, 17)) +
scale_fill_manual(name = "legend", values = c("orange", NA, NA)) +
ylab("Current Account Transactions (Billion $)") +
xlab(NULL) +
theme_bw(14) + scale_x_discrete(breaks = seq(1999, 2013, by = 2)) +
scale_y_continuous(labels = dollar, limits = c(-1, 4), breaks = seq(-1, 4, by = .5)) +
geom_hline(yintercept = 0) +
theme(legend.key = element_blank(), legend.background = element_rect(colour = 'black', fill = 'white'), legend.position = "top", legend.title = element_blank()) +
guides(col = guide_legend(ncol = 1))
添加 +guides(fill = Guide_legend(override.aes = list(colour = NULL)))
会删除斜杠,但也会删除深绿色/深蓝色(它会保留橙色填充)。
最佳答案
要消除顶部图例中出现的“当前帐户余额”,您可以将组
、颜色
和形状
美学移出父级 ggplot()
调用并适本地调用 geom_line()
和 geom_point()
。这可以具体控制哪些美学适用于共享变量名称的两个数据集。
ggplot(data = df1, aes(x = Year, y = value)) +
geom_line(aes(group = variable, colour = variable)) +
geom_point(aes(shape = variable, colour = variable), size = 3) +
geom_bar(data = df2, aes(x = Year, y = value, fill = variable),
stat = "identity", position = 'identity', alpha = 0.8, guide = 'none') +
ylab("Current Account Transactions (Billion $)") +
xlab(NULL) +
theme_bw(14) +
scale_x_discrete(breaks = seq(1999, 2013, by = 2)) +
scale_y_continuous(labels = dollar, limits = c(-1, 4),
breaks = seq(-1, 4, by = .5)) +
geom_hline(yintercept = 0) +
guides(col = guide_legend(ncol = 1)) +
theme(legend.key = element_blank(),
legend.background = element_rect(colour = 'black', fill = 'white'),
legend.position = "top", legend.title = element_blank(),
legend.box.just = "left")
这个答案有一些缺点。举几个例子:1)保留了两个独立的图例,如果您决定不将它们装箱(例如,不设置 legend.background
),它们可能会被伪装。 2) 从顶部图例中删除 df2 变量意味着它不会消耗第一个默认颜色(与之前一样,纯属巧合),因此现在“平衡...”和“导出...”都显示为粉红色,因为填充图例回收默认色阶。
关于r - ggplot2:合并 geom_line、geom_point 和 geom_bar 的图例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28684612/
我正在尝试使用 ggplot 创建带有类别标签的水平条形图。 我已经能够毫不费力地创建绘图,并且可以贴上标签,但是我遇到了格式问题。最终,如果合适,我希望我的标签在栏内,否则就在栏外而不截断标签。 以
我有一些数据可以捕获多个时间段内两个不同组的百分比。 df % filter(key=="You"), aes(x=period, y=value, color=)) + geom_bar(sta
我有下图,它本质上是两个分布的直方图,它们并排绘制: my.barplot <- function( df, title="", ... ) { df.count <- aggregate( df
我正在寻找一种方法来移除添加到 geom_bar 中的非重叠底部边框。我不想使用像 geom_hline(yintercept = 0, color = "white") 这样的选项,因为它覆盖了原始
我不确定是否geom_bar能够(可能我不能)用 geom_bar 创建我需要的图.我想要一个条形图,但不是从 0 开始,我有一个最小值和最大值作为每个条形的起点和终点。所需的输出如下所示: 数据结构
我的目标是重现这个图,我的问题是重现每个条中的渐变填充。 评论后添加 @PavoDive 的好评将我们引导至 a question这基本上是说“你不能用 ggplot2 做到这一点,而且即使你能做到,
我想用不同的颜色突出显示中间的栏(名为 SSA)。我已经尝试了可用的示例,但没有得到想要的结果。 看来我无法正确使用 ifelse 元素。感谢您帮助检测错误。 “填充”不是我数据中的一个因素,这与此处
我正在使用 ggplot2 和 geom_bar() 来绘制一些统计数据。有没有办法自定义栏中的填充物以及每个栏的线条类型?我想强调两个关键特征:总共有五个条形图,它们代表的数字是从两种不同类型的输入
我正在尝试更改 ggplot 条形图的不透明度。考虑以下示例: df <- data.frame(period = rep(c("current", "past"), 3),
我想做什么 我目前为我的绘图设置了一个自定义主题,并且我希望在此之上为所有类型的绘图设置一些预定义的参数。我的第一个重点是条形图,我想在其中更改默认宽度。 ggplot2中geom_bar的默认宽度为
我正在尝试使用 geom_bar 绘制堆积条形图并在条形图中用其值标记每个类别。由于某些类别的值较小,因此条形图相应段的高度有时较小。所以,我正在尝试使用 geom_text 来调整标签的大小。 .
我希望能够创建一个条形图,该图还显示了每个组中条形的平均值。 AND 显示图例中的平均条。 我已经能够使用下面的代码获得这个图形条形图,这很好,但我希望能够看到图例中的平均线。 ##The data
我想使用条形图和 ggplot 可视化数据. 我有下面的数据,当我想查看这些数据时,负值的文本没有显示在 Bar 下方。 dat <- read.table(text = "sample Types
我有一个数据框排列如下: condition,treatment,value A , one , 2 A , one , 1 A , two
我的数据只包含一个变量和一个白天列。我想制作一个彩色的 geom_bar() 图。这意味着每个条形都有不同的颜色。 数据示例: daytime price 2000-01-01 30 2000-01-
我已经搜索和搜索,但我似乎无法找到一种优雅的方式来做到这一点! 我有一个数据集 Data由 Data$x 组成(日期)和 Data$y (数字从 0 到 1) 我想在条形图中绘制它们: ggplot(
我试图实现的是让条形按每个面板的给定变量排序。 一个简单的例子: library(ggplot2) library(plyr) df <- data.frame(fac = c
我尽力阅读与我的问题相关的问题。最相关的是:question .但是我无法弄清楚如何解决我的问题。我有一个像这样的数据集 structure(list(COMPANY = structure(1
我发现这非常棘手。我想创建一个趋势条形图,显示按日期提交的日期时间的计数。 一些数据: structure(list(id = c("p036502", "p039565", "p233823", "
我不明白为什么我不能改变这个 geom_bar 情节的填充美学 # Reprex dataset df % ggplot(aes(x = fct_rev(fct_infreq(modality))
我是一名优秀的程序员,十分优秀!