Пометьте справку для гистограмм - PullRequest
2 голосов
/ 29 мая 2020

У меня есть набор гистограмм, и я хотел бы нанести метки на стандартное отклонение + - 1 и среднее значение. У меня есть строки, но мне нужны и ярлыки. Я хотел бы, чтобы метки в нижней части гистограмм были с белым фоном, чтобы шрифт читался на фоне цветов гистограммы.

library(dply)
library(ggplot2)

a = runif(1000,1,100)
b = runif(1000,1,100)
c = runif(1000,1,100)

amount = c(a,b,c)

cat = c(rep("a",1000), rep("b",1000), rep("c",1000))

hist.data = data.frame(amount,cat)
names(hist.data) = c("amount","cat")

hist.data$cat = factor(hist.data$cat, levels = c("a","b","c"))
pricedata = ddply(hist.data, c("cat"), summarize, avg = mean(amount), minus.stdev = mean(amount)-sd(amount), 
  plus.stdev = mean(amount) + sd(amount))
pricedata = pricedata[order(pricedata$avg),]


ggplot(hist.data, aes(x=amount, fill = cat))+
  geom_histogram(color="white", alpha = .8, position = 'identity', binwidth = 5)+
  theme_test()+
  geom_vline(aes(xintercept = avg), data = pricedata, color = "black", size = 1)+


  geom_vline(aes(xintercept = minus.stdev), data = pricedata, color = "black", size = .75, linetype = "dotted")+


  geom_vline(aes(xintercept = plus.stdev), data = pricedata, color = "black", size = .75, linetype = "dotted")+


  facet_grid(cat ~., scales = "free")+
  scale_y_continuous(expand = c(0,0),name = "Count")+
  scale_x_continuous(labels = scales::dollar, name="\nAmount", limits = c(0,100))

enter image description here

Ответы [ 2 ]

3 голосов
/ 29 мая 2020

Я бы рекомендовал преобразовать ваш pricedata в длинный формат - это несколько упрощает ваши geom_vline вызовы (хотя вам нужно добавить size и linetype масштаб ...) и делает использование geom_label довольно простым . На данный момент geom_label довольно новый и не позволяет вам делать такие вещи, как изменение угла.

pricedata_long = tidyr::pivot_longer(pricedata, -cat)


ggplot(hist.data, aes(x=amount, fill = cat))+
  geom_histogram(color="white", alpha = .8, position = 'identity', binwidth = 5)+
  theme_test()+
  geom_vline(aes(xintercept = value, linetype = name, size = name),
             data = pricedata_long, color = "black", show.legend = FALSE) +
  geom_label(aes(x = value, label = scales::dollar_format()(value)), data = pricedata_long,
             y = 0, fill = "white", vjust = -.1,
             show.legend = FALSE) +
  scale_size_manual(values = c("avg" = 1, "minus.stdev" = 0.75, "plus.stdev" = 0.75)) +
  scale_linetype_manual(values = c("avg" = "solid", "minus.stdev" = "dotted", "plus.stdev" = "dotted")) +

  facet_grid(cat ~., scales = "free")+
  scale_y_continuous(expand = c(0,0),name = "Count")+
  scale_x_continuous(labels = scales::dollar, name="\nAmount", limits = c(0,100))

enter image description here

1 голос
/ 29 мая 2020

И если вы хотите внести наименьшее количество изменений в существующий код (хотя я согласен, что другие ответы более элегантны), вы можете добавить три строки к существующему


ggplot(hist.data, aes(x=amount, fill = cat))+
  geom_histogram(color="white", alpha = .8, position = 'identity', binwidth = 5)+
  theme_test()+
  geom_vline(aes(xintercept = avg), data = pricedata, color = "black", size = 1)+
  geom_label(aes(x = avg, y = 10, label = scales::dollar_format()(avg)), data = pricedata, fill = "white", size = 3) +
  geom_vline(aes(xintercept = minus.stdev), data = pricedata, color = "black", size = .75, linetype = "dotted")+
  geom_label(aes(x = minus.stdev, y = 10, label = scales::dollar_format()(minus.stdev)), data = pricedata, fill = "white", size = 3) +
  geom_vline(aes(xintercept = plus.stdev), data = pricedata, color = "black", size = .75, linetype = "dotted")+
  geom_label(aes(x = plus.stdev, y = 10, label = scales::dollar_format()(plus.stdev)), data = pricedata, fill = "white", size = 3) +
  facet_grid(cat ~., scales = "free")+
  scale_y_continuous(expand = c(0,0),name = "Count")+
  scale_x_continuous(labels = scales::dollar, name="\nAmount", limits = c(0,100))

...