直方图的标签帮助
Label help for histograms
我有一组直方图,想在 +- 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))
我建议将您的 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))
如果您想对现有代码进行最少的更改(尽管我同意其他答案更优雅),您可以在现有代码中添加三行
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))
我有一组直方图,想在 +- 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))
我建议将您的 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))
如果您想对现有代码进行最少的更改(尽管我同意其他答案更优雅),您可以在现有代码中添加三行
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))