将图例添加到具有不同类型美学的ggplot直方图中 [英] Add legend to ggplot histogram with different types of aesthetics
问题描述
我想在其中一个地块上添加图例,但我的审美观不同,我从未创建过图例,因此我很难确定如何构建图例.
I want to add a legend to one of my plots, but I have different aesthetics and I never created a legend so I find it very difficult to determine how to build it.
我的审美观念之一是填充代码,我将其手动添加为矢量.另一种美学是我在geom_vline中添加的一条垂直线.
One of my aesthetics is a fill code, which I added manually as a vector. The other aesthetic is a vertical line that I added with geom_vline.
在下面的图形中,我要添加三个特征:1)深蓝色的条形; 2)浅蓝色的条形; 3)垂直线.
From the graph below, there are three characteristics that I want to add to the legend: 1) The bars with color dark blue, 2) The bars with color light blue and 3) The vertical line.
有人对我有一个关于如何有效地编写代码的建议吗?
Does anyone have a suggestion for me on how to code this efficiently?
#df
df <- data.frame(Time_Diff <- runif(1000, 0, 200))
# Show median, IQR range and outliers
colors <- c(rep("blue",3), rep("paleturquoise2",38))
bp_overall <- ggplot(data = df, aes(Time_Diff))
bp_overall +
geom_histogram(binwidth = 5, fill = colors) + #create histogram
ggtitle("Time Difference") +
xlab("Time in Days") +
ylab("Amount") +
geom_vline(xintercept = 3, linetype = "twodash", size = 1, colour= "darkblue") + #show median
scale_x_continuous(breaks = seq(0, 202, 10)) +
theme_light() +
theme(panel.grid.minor = element_blank(),
panel.border = element_blank(), #remove all border lines
axis.line.x = element_line(size = 0.5, linetype = "solid", colour = "black"), #add x-axis border line
axis.line.y = element_line(size = 0.5, linetype = "solid", colour = "black")) + #add y-axis border line
theme(plot.title = element_text(family = windowsFont("Verdana"), color="black", size=14, hjust = 0.5)) +
theme(axis.title = element_text(family = windowsFont("Verdana"), color="black", size=12))
在Djork的建议下,我找到了以下脚本,该脚本可以工作,我很满意.我现在要完成的唯一一件事就是使图例成为一个整体(直方图图例和行图例合并为一个连贯的整体).有人有建议吗?
After the suggestion of Djork I arrived to the following script, which works and I am happy with. The only thing I am trying to accomplish now is to get the Legend to be one whole (Histogram Legend and Line Legend are combined into a coherent whole). Anyone has a suggestion?
# reformat data
set.seed(1)
df <- data.frame(runif(1000, 0, 200))
colnames(df) <- "Time_Diff"
bp_overall +
geom_histogram(data = subset(df, Time_Diff <= 12.5), aes(x = Time_Diff, fill="BAR BLUE"), binwidth = 5) + # subset for blue data, where aes fill is fill group 1 label
geom_histogram(data = subset(df, Time_Diff > 12.5), aes(x = Time_Diff, fill="BAR TURQUOISE"), binwidth = 5) + # subset for turquoise data, where aes fill is fill group 2 label
scale_fill_manual("Histogram Legend", values=c("blue", "paleturquoise2")) + # manually assign histogram fill colors
geom_vline(aes(xintercept = 3, colour="LINE DARK BLUE"), linetype="twodash", size = 1) + # where aes colour is vline label
scale_colour_manual("Line Legend", values="darkblue") + #removed legend title
scale_x_continuous(breaks = seq(0, 202, 10)) +
ggtitle("Time Difference") +
xlab("Time in Days") +
ylab("Amount") +
theme_light() +
theme(panel.grid.minor = element_blank(),
panel.border = element_blank(),
axis.line.x = element_line(size = 0.5, linetype = "solid", colour = "black"),
axis.line.y = element_line(size = 0.5, linetype = "solid", colour = "black"),
legend.position = c(0.95, 0.95),
legend.justification = c("right", "top"),
legend.box.just = ("right"))
推荐答案
我认为@Jimbou的建议更可取,但是存在一种变通方法,可以通过将字符值分配给geom_histogram
aes
fill
值和geom_vline
aes
colour
值,然后在scale_fill_manual
或scale_colour_manual
中设置颜色.
I think @Jimbou's suggestion is preferable, but there is a work-around for creating legends artificially by assigning a character value to the geom_histogram
aes
fill
value and geom_vline
aes
colour
value, then setting colors in scale_fill_manual
or scale_colour_manual
.
但是,采用这种方法,aes
fill
仅会使用一个值(长度1),因此您必须将df
的蓝色和青绿色值子集化,并为每个值绘制直方图,其截止值由您决定binwidth
.
However with this approach aes
fill
will only take one value (length 1) so you have to subset your df
for the blue and turquoise values and plot a histogram for each, with the cutoff determined by your binwidth
.
这是方法.请注意您的数据需要重新格式化.
Here is the approach. Note your data needed reformatting.
# reformat data
set.seed(1)
df <- data.frame(runif(1000, 0, 200))
colnames(df) <- "Time_Diff"
bp_overall <- ggplot(data = df)
bp_overall +
geom_histogram(data = subset(df, Time_Diff <= 12.5), aes(x = Time_Diff, fill="BAR BLUE"), binwidth = 5) + # subset for blue data, where aes fill is fill group 1 label
geom_histogram(data = subset(df, Time_Diff > 12.5), aes(x = Time_Diff, fill="BAR TURQUOISE"), binwidth = 5) + # subset for turquoise data, where aes fill is fill group 2 label
scale_fill_manual("Histogram Legend", values=c("blue", "paleturquoise2")) + # manually assign histogram fill colors
geom_vline(aes(xintercept = 3, colour="LINE DARK BLUE"), linetype="twodash", size = 1) + # where aes colour is vline label
scale_colour_manual("Line Legend", values="darkblue") + # manually assign vline colors
scale_x_continuous(breaks = seq(0, 202, 10)) +
ggtitle("Time Difference") +
xlab("Time in Days") +
ylab("Amount") +
theme_light() +
theme(panel.grid.minor = element_blank(),
panel.border = element_blank(),
axis.line.x = element_line(size = 0.5, linetype = "solid", colour = "black"),
axis.line.y = element_line(size = 0.5, linetype = "solid", colour = "black"))
等等.添加剩余的theme
.
要回答有关如何统一图例并减小两种图例类型之间的间距的问题
EDITED: To answer question on how to unify legend and decrease spacing between the two legend types
(1)通过在scale_fill_manual
中设置为"来删除vline的图例name
,在scale_colour_manual
中将直方图填充图例name
更改为"Legend".
(1) Remove legend name
for vline by setting to "" in scale_fill_manual
, change histogram fill legend name
to "Legend" in scale_colour_manual
.
(2)指定应在其中显示图例的order
,首先填充,然后使用guides
guide_legend
进行颜色.
(2) Specify order
in which legends should appear, fill first then colour using guides
guide_legend
.
(3)通过将legend.spacing.y
设置为0
来删除两个图例类型之间的y间距,并使用theme
(3) Remove the y-spacing between the two legend types by setting legend.spacing.y
to 0
, and remove margins on top and bottom using legend.margin
in theme
bp_overall <- ggplot(data = df)
bp_overall +
geom_histogram(data = subset(df, Time_Diff <= 12.5), aes(x = Time_Diff, fill="BAR BLUE"), binwidth = 5) +
geom_histogram(data = subset(df, Time_Diff > 12.5), aes(x = Time_Diff, fill="BAR TURQUOISE"), binwidth = 5) +
scale_fill_manual(name="Legend", values=c("blue", "paleturquoise2")) +
geom_vline(aes(xintercept = 3, colour="LINE DARK BLUE"), linetype="twodash", size = 1) +
scale_colour_manual(name="", values="darkblue") +
scale_x_continuous(breaks = seq(0, 202, 10)) +
ggtitle("Time Difference") +
xlab("Time in Days") +
ylab("Amount") +
theme_light() +
theme(panel.grid.minor = element_blank(),
panel.border = element_blank(),
axis.line.x = element_line(size = 0.5, linetype = "solid", colour = "black"),
axis.line.y = element_line(size = 0.5, linetype = "solid", colour = "black"),
legend.spacing.y = unit(0, "cm"),
legend.margin=margin(t=0, r=0.5, b=0, l=0.5, unit="cm")) +
guides(fill = guide_legend(order = 1),
colour = guide_legend(order = 2))
这篇关于将图例添加到具有不同类型美学的ggplot直方图中的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!