0

This question is a follow up question to one I made previously here

Thanks to @andrew_reece I have the following code (slight modification by myself):

The current output looks like;

enter image description here

What I am trying to do is to;

1) Order the bars from highest to lowest for each group

2) Add the legend vertically inside each bar (if this is possible as some bars are quite small)

feature_suffix <- c("", "1", "2", "3")
year_prefix <- c("Last", "One", "Two", "Three")

x <- map2(feature_suffix, year_prefix,
     ~ df %>% 
       select(feature = paste0("Feature", .x), value = paste0(.y, "Year")) %>%
       mutate(year = paste0(.y, "Year"))
) %>%
  bind_rows(.) %>%
  mutate(value = as.numeric(value))

xy <- x %>% 
  group_by(year) %>% 
  arrange(year, desc(value)) 

ggplot(data = xy, aes(year, value, fill=feature)) +
geom_bar(stat="summary", fun.y=mean, position = position_dodge(.9))

The data

structure(list(Feature = structure(c(6L, 8L, 5L, 11L, 4L, 1L, 
3L, 2L, 7L, 10L, 9L), .Label = c("CA.CL", "CA.TA", "CF.NCL", 
"CL.FinExp", "DailySALES.EBIT", "EBIT.FinExp", "EQ.Turnover", 
"logTA", "SALES.WC", "TL.EQ", "TL.TA"), class = "factor"), LastYear = structure(c(11L, 
10L, 9L, 8L, 7L, 6L, 5L, 4L, 3L, 2L, 1L), .Label = c("0.0322326139141556", 
"0.0418476895487213", "0.0432506289654195", "0.0504153839825875", 
"0.0546743268879608", "0.0549979876321639", "0.0577181189006888", 
"0.107473282590142", "0.112929456881545", "0.139817111427972", 
"0.304643399268643"), class = "factor"), Feature1 = structure(c(8L, 
6L, 1L, 3L, 11L, 9L, 4L, 10L, 5L, 7L, 2L), .Label = c("CA.CL", 
"CA.TA", "CF.NCL", "CL.FinExp", "DailySALES.EBIT", "EBIT.FinExp", 
"EQ.Turnover", "logTA", "SALES.WC", "TL.EQ", "TL.TA"), class = "factor"), 
    OneYear = structure(c(11L, 10L, 9L, 8L, 7L, 6L, 5L, 4L, 3L, 
    2L, 1L), .Label = c("0.0241399538457295", "0.025216904130219", 
    "0.0288943827773218", "0.0290134083108585", "0.0393919110672302", 
    "0.0484816627329215", "0.0660812827117713", "0.0728943625765924", 
    "0.161968277822423", "0.177638448005797", "0.326279406019136"
    ), class = "factor"), Feature2 = structure(c(8L, 1L, 6L, 
    9L, 11L, 3L, 2L, 5L, 4L, 10L, 7L), .Label = c("CA.CL", "CA.TA", 
    "CF.NCL", "CL.FinExp", "DailySALES.EBIT", "EBIT.FinExp", 
    "EQ.Turnover", "logTA", "SALES.WC", "TL.EQ", "TL.TA"), class = "factor"), 
    TwoYear = structure(c(11L, 10L, 9L, 8L, 7L, 6L, 5L, 4L, 3L, 
    2L, 1L), .Label = c("0.0179871842234001", "0.0245082857218191", 
    "0.0276514285623367", "0.0359182021377123", "0.0461243809893583", 
    "0.046996298679094", "0.0566018025811507", "0.0648203522637183", 
    "0.0815346014308433", "0.210073355633034", "0.387784107777533"
    ), class = "factor"), Feature3 = structure(c(8L, 1L, 11L, 
    7L, 9L, 5L, 2L, 6L, 3L, 4L, 10L), .Label = c("CA.CL", "CA.TA", 
    "CF.NCL", "CL.FinExp", "DailySALES.EBIT", "EBIT.FinExp", 
    "EQ.Turnover", "logTA", "SALES.WC", "TL.EQ", "TL.TA"), class = "factor"), 
    ThreeYear = structure(c(11L, 10L, 9L, 8L, 7L, 6L, 5L, 4L, 
    3L, 2L, 1L), .Label = c("0.0275302883400183", "0.0282746857626618", 
    "0.0403110592712779", "0.0409053619122674", "0.0514576931772448", 
    "0.0570216362435987", "0.076967996046118", "0.0831531609222676", 
    "0.0904194376665785", "0.139457271733071", "0.364501408924896"
    ), class = "factor")), .Names = c("Feature", "LastYear", 
"Feature1", "OneYear", "Feature2", "TwoYear", "Feature3", "ThreeYear"
), row.names = c(NA, -11L), class = "data.frame")
user113156
  • 6,761
  • 5
  • 35
  • 81
  • 2
    We have to assume that you googled "order bars in ggplot2". This is a FAQ. Please show us what you have tried and explain why things didn't work. Sorry, but I doubt your second request for code is a very good idea (if I understood you correctly ;) ) Cheers. – Henrik Jun 25 '18 at 20:28
  • Yes, I have spent the better part of today trying to order these bar charts by group and everything I have tried seems not to work, the part of the code `xy <- x %>% group_by(year) %>% arrange(year, desc(value)) ` does not order the plots when I graph it through ggplot so I am a little unsure why... – user113156 Jun 25 '18 at 20:37
  • Are you saying that point 2 (the text inside the bar plots) is not a good idea? I would have to agree also but I am trying to see how it would look. – user113156 Jun 25 '18 at 20:38
  • 2
    It seems like I misunderstood you when you wrote '_legend_ [...] inside each bar". If you want to add text/labels inside bars _instead_ of a legend, use `geom_text`. – Henrik Jun 25 '18 at 20:41
  • Ah yes, I see how this can be misinterpreted, I am just trying to vertically put the text of each variable in each bar. Would using `geom_text` require me to manually specify the location of the text. The previous `geom_text` I have been using look like the following `geom_text(aes(x = 0.50, y = 0.125, label = paste("SOME TEXT three", round(pr3$variable, 4))), size = 4, colour = "black") +` Where I had to specify the location (I was using a line graphic here) – user113156 Jun 25 '18 at 20:47
  • 2
    Please study the examples in `?geom_text`, starting with "# Aligning labels and bars". Also please use google: "geom_text grouped barplot". Good luck! – Henrik Jun 25 '18 at 20:50
  • @user113156: see this answer https://stackoverflow.com/a/26661791/786542 – Tung Jun 26 '18 at 01:44
  • @user113156: and this https://stackoverflow.com/a/48942323/786542 – Tung Jun 26 '18 at 01:46

0 Answers0