英文:
Why does my legend not match the colour of my bars in ggplot2?
问题
I converted the bars of my graph from gray with a coloured outline to a solid fill which resulted in half of my error bars not being visible due to being the same colour. I therefore changed the colour of the error bars to black to improve contrast but this has resulted in the items of my legend all being black and I cannot find a way to make the legend match the colour of my bars without making a complete mess of the graph (e.g. bars stacking on top of each other and error bars disappearing).
我的图表中,我将柱形图从灰色填充更改为具有彩色轮廓的实体填充,导致一半的误差线由于颜色相同而不可见。因此,我将误差线的颜色更改为黑色以改善对比度,但这导致我的图例中的项目都是黑色的,我无法找到一种方法使图例与我的柱形图的颜色匹配,而不会让图表混乱(例如,柱形图重叠和误差线消失)。
My data is as follows:
我的数据如下:
emean_Sleep_State <- c('WAKE','SWS','REM','WAKE','SWS','REM','WAKE','SWS','REM')
emean_Treatment <- c('Disturbed','Disturbed','Disturbed','Recovery','Recovery','Recovery','UnDisturbed','UnDisturbed','UnDisturbed')
emean_Means <- c(31.2,48.8,23.2,28.2,50.1,24.1,27.7,49.9,24.2)
emean_SE <- c(2.91,2.80,2.80,2.87,2.74,2.78,2.92,2.81,2.81)
emeanframe <- data.frame(emean_Sleep_State,emean_Treatment,emean_Means,emean_SE)
Estimated_Max_Means_emean <- emeanframe$emean_Means + emeanframe$emean_SE
Estimated_Min_Means_emean <- emeanframe$emean_Means - emeanframe$emean_SE
emeanframe <- data.frame(emean_Sleep_State,emean_Treatment,emean_Means,emean_SE,Estimated_Max_Means_emean,Estimated_Min_Means_emean)
realvalueemean <- apply(emeanframe[,c(3,5,6)],2,FUN=backtransANG)
emeanframe$realmean <- realvalueemean[,1]
emeanframe$realmaxmean <- realvalueemean[,2]
emeanframe$realminmean <- realvalueemean[,3]
Similarly, the code I used to create my graphs is:
同样,我用于创建图表的代码如下:
emeanplot <- ggplot(as.data.frame(emeanframe$'emean_Treatment'),aes(x = factor(emeanframe$'emean_Sleep_State'),emeanframe$'realmean',color=emeanframe$'emean_Treatment'))+
geom_bar(stat = 'identity',position = 'dodge',fill = c('#F8766D','#F8766D','#F8766D','#00BA38','#00BA38','#00BA38','#619CFF','#619CFF','#619CFF')) + theme(axis.text.x = element_text(size = 12)) + theme(axis.text.y = element_text(size = 12) +
scale_x_discrete(limits = c('WAKE','SWS','REM')) +
geom_errorbar(aes(ymin=emeanframe$'realminmean',ymax=emeanframe$'realmaxmean'),width=0.2,position = position_dodge(width = 0.9),linewidth=1) +
scale_color_manual(values = c('black','black','black'))+
xlab('Sleep State') + ylab('Proportion of Behaviour') + labs(color = "Type of Night",size=14) + ylim(0,1) + theme(axis.title.x = element_text(size = 14)) + theme(axis.title.y = element_text(size=14))
I'm not sure exactly what I am doing wrong so any help would be greatly appreciated!
我不确定我到底做错了什么,所以非常感谢任何帮助!
I have tried some permutations of scale_color_manual, scale_fill_manual, colour=c(''), but not have resulted in a solution. Namely, my legend is still 3 black boxes which do not match my bars which are red, green and blue.
我尝试过一些scale_color_manual,scale_fill_manual,color=c('')的排列组合,但没有找到解决方案。换句话说,我的图例仍然是3个黑色方框,与我的柱形图不匹配,而柱形图是红色、绿色和蓝色。
英文:
I converted the bars of my graph from gray with a coloured outline to a solid fill which resulted in half of my error bars not being visible due to being the same colour. I therefore changed the colour of the error bars to black to improve contrast but this has resulted in the items of my legend all being black and I cannot find a way to make the legend match the colour of my bars without making a complete mess of the graph (e.g. bars stacking on top of each other and error bars disappearing).
My data is as follows:
emean_Sleep_State <- c('WAKE','SWS','REM','WAKE','SWS','REM','WAKE','SWS','REM')
emean_Treatment <- c('Disturbed','Disturbed','Disturbed','Recovery','Recovery','Recovery','UnDisturbed','UnDisturbed','UnDisturbed')
emean_Means <- c(31.2,48.8,23.2,28.2,50.1,24.1,27.7,49.9,24.2)
emean_SE <- c(2.91,2.80,2.80,2.87,2.74,2.78,2.92,2.81,2.81)
emeanframe <- data.frame(emean_Sleep_State,emean_Treatment,emean_Means,emean_SE)
Estimated_Max_Means_emean <- emeanframe$emean_Means + emeanframe$emean_SE
Estimated_Min_Means_emean <- emeanframe$emean_Means - emeanframe$emean_SE
emeanframe <- data.frame(emean_Sleep_State,emean_Treatment,emean_Means,emean_SE,Estimated_Max_Means_emean,Estimated_Min_Means_emean)
realvalueemean <- apply(emeanframe[,c(3,5,6)],2,FUN=backtransANG)
emeanframe$realmean <- realvalueemean[,1]
emeanframe$realmaxmean <- realvalueemean[,2]
emeanframe$realminmean <- realvalueemean[,3]
Similarly, the code I used to create my graphs is:
emeanplot <- ggplot(as.data.frame(emeanframe$'emean_Treatment')
,aes(x = factor(emeanframe$'emean_Sleep_State'),emeanframe$'realmean'
,color=emeanframe$'emean_Treatment'))+
geom_bar(stat = 'identity',position = 'dodge',fill = c('#F8766D','#F8766D','#F8766D','#00BA38','#00BA38','#00BA38','#619CFF','#619CFF','#619CFF')) + theme(axis.text.x = element_text(size = 12)) + theme(axis.text.y = element_text(size = 12)) +
scale_x_discrete(limits = c('WAKE','SWS','REM')) +
geom_errorbar(aes(ymin=emeanframe$'realminmean'
,ymax=emeanframe$'realmaxmean')
,width=0.2,position = position_dodge(width = 0.9),linewidth=1) +
scale_color_manual(values = c('black','black','black'))+
xlab('Sleep State') + ylab('Proportion of Behaviour') + labs(color = "Type of Night",size=14) + ylim(0,1) + theme(axis.title.x = element_text(size = 14)) + theme(axis.title.y = element_text(size=14))
I'm not sure exactly what I am doing wrong so any help would be greatly appreciated!
I have tried some permutations of scale_color_manual, scale_fill_manual, colour=c('') but not have resulted in a solution. Namely, my legend is still 3 black boxes which do not match my bars which are red, green and blue.
答案1
得分: 0
以下是翻译好的代码部分:
library(ggplot2)
ggplot(emeanframe,
aes(x = emean_Sleep_State,
y = realmean,
fill = emean_Treatment)) +
geom_col(position = 'dodge',
colour = "black",
alpha = 0.5) + # this is what makes the errorbars visible!
geom_errorbar(aes(ymin = realminmean,
ymax = realmaxmean,
colour = emean_Treatment),
width = 0.2,
position = position_dodge(width = 0.9),
linewidth = 1) +
scale_x_discrete(limits = c('WAKE','SWS','REM')) +
labs(x = 'Sleep State',
y = 'Proportion of Behaviour',
fill = "Type of Night",
color = "Type of Night") +
# ylim(0, 1) + # commented out because I dont have the backtransANG function that I currently replaced with I()
theme(axis.text.x = element_text(size = 12),
axis.text.y = element_text(size = 12),
axis.title.x = element_text(size = 14),
axis.title.y = element_text(size = 14))
这是代码的翻译。
英文:
Solution
You could solve this way:
library(ggplot2)
ggplot(emeanframe,
aes(x = emean_Sleep_State,
y = realmean,
fill = emean_Treatment)) +
geom_col(position = 'dodge',
colour = "black",
alpha = 0.5) + # this is what makes the errorbars visible!
geom_errorbar(aes(ymin = realminmean,
ymax = realmaxmean,
colour = emean_Treatment),
width = 0.2,
position = position_dodge(width = 0.9),
linewidth = 1) +
scale_x_discrete(limits = c('WAKE','SWS','REM')) +
labs(x = 'Sleep State',
y = 'Proportion of Behaviour',
fill = "Type of Night",
color = "Type of Night") +
# ylim(0, 1) + # commented out because I dont have the backtransANG function that I currently replaced with I()
theme(axis.text.x = element_text(size = 12),
axis.text.y = element_text(size = 12),
axis.title.x = element_text(size = 14),
axis.title.y = element_text(size = 14))
I cleaned up a bit your code because you are not supposed to use $
to call the right columns inside of aes
.
The important change I made to solve your problem is to add alpha = 0.5
into geom_col
(geom_col
is literally geom_bar
when stat = 'identity'
)
What else I changed:
- I removed
fill
ingeom_bar
(nowgeom_col
) because it wasn't necessary since I replacedcolour
in the firstaes
withfill
- I wrote
colour = "black"
to draw a line around the bars - I wrote
colour = emean_Treatment
to colour the errorbar like the bars scale_colour_manual
wasn't necessary anymore- I set all the labels into
labs
(and addfill
) - I merged together all the
themes
Alternative
Alternatively, if you just want the legend to match the bars and you want the errorbars in black, you can use this code:
ggplot(emeanframe,
aes(x = emean_Sleep_State,
y = realmean,
fill = emean_Treatment)) +
geom_col(position = 'dodge',
colour = "black") +
geom_errorbar(aes(ymin = realminmean,
ymax = realmaxmean),
colour = "black",
width = 0.2,
position = position_dodge(width = 0.9),
linewidth = 1) +
scale_x_discrete(limits = c('WAKE','SWS','REM')) +
labs(x = 'Sleep State',
y = 'Proportion of Behaviour',
color = "Type of Night") +
# ylim(0, 1) + # commented out because I dont have the backtransANG function that I currently replaced with I()
theme(axis.text.x = element_text(size = 12),
axis.text.y = element_text(size = 12),
axis.title.x = element_text(size = 14),
axis.title.y = element_text(size = 14))
Here:
- I set
colour = "black"
intogeom_errorbar
- I removed
alpha = 0.5
because it was no longer needed
How I created you data
I didn't know what backtransANG
was so I just wrote like this:
realvalueemean <- apply(emeanframe[,c(3,5,6)], 2, FUN = I)
In your plot you may want to uncomment ylim(0,1) +
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论