如何连接条形图,就像 geom_density_ridges 对直方图所做的那样
Posted
技术标签:
【中文标题】如何连接条形图,就像 geom_density_ridges 对直方图所做的那样【英文标题】:How to connect bar plot, just like geom_density_ridges does for histogram 【发布时间】:2018-12-27 17:16:09 【问题描述】:我无法在 R 中创建绘图。如果我有类似的数据
我要创作:
x 轴为 Sepal.length、Sepal.Width、Petal.Width、Petal.Length ,y轴是不同的物种,高度是值。并根据 y 轴用不同的颜色填充每个条形图。
谢谢!
到目前为止,我已经尝试过:
iris_mean <- aggregate(iris[,1:4], by=list(Species=iris$Species), FUN=mean)
library(reshape2)
df_mean <- melt(iris_mean, id.vars=c("Species"), variable.name = "Samples",
value.name="Values")
ggplot(df_mean,aes(Samples,Values))+
geom_bar(aes(fill=Species),stat="identity")+
facet_grid(Species~.,scale='free',space='free')+theme(panel.margin = unit(0.1, "lines"))
ggplot(df_mean,aes(x=Samples,y=Species,height =Values))+
geom_density_ridges2(aes(fill=Species),stat='identity',
scale=1.5,
alpha=0.1,
lty = 1.1)
【问题讨论】:
到目前为止你尝试过什么代码?你应该发布它,否则很难得到答案。 我试过了:ggplot(df,aes(Samples,Values))+ geom_bar(aes(fill=Species),stat="identity")+ facet_grid(Species~.,scale='free ',space='free')+theme(panel.margin = unit(0.1, "lines")) and \n ggplot(df_mean,aes(x=Samples,y=Species,height =Values))+ geom_density_ridges2(aes (fill=Species),stat='identity', scale=1.5, alpha=0.1, lty = 1.1) 你看到在你的山脊图中你只有一条线吗?这是因为岭图用于显示值的分布,就像直方图一样,但你只给它一个平均值。尝试只使用原始值,而不是平均值 【参考方案1】:你的多面情节是在正确的轨道上。就像我在评论中所说的那样,您正在尝试显示值的分布,而不是值的手段。您可以手动设置中断并计算计数以显示在geom_bar
中,但这很容易变得非常复杂,特别是因为不同类型的度量具有不同的尺度。我建议只使用简单的直方图。我使用gather
而不是melt
来制作长数据——这只是偏好。
除了你所拥有的,这只是 1. 使用发行版和 2. 巧妙地处理主题的问题。如果您移动刻面标签,旋转左侧条带,取出条带背景,并删除面板之间的垂直间距,您基本上得到了一个脊图。我对ggridges
不是很熟悉,但我猜它会做类似的事情。从这里,您可以调整您认为合适的方式。
library(tidyverse)
iris_long <- as_tibble(iris) %>%
gather(key = measure, value = value, -Species)
ggplot(iris_long, aes(x = value, fill = Species)) +
# geom_density_ridges() +
geom_histogram(show.legend = F) +
scale_y_continuous(breaks = NULL) +
labs(x = "Measure", y = "Species") +
facet_grid(Species ~ measure, scales = "free", switch = "both") +
theme(strip.background = element_blank(), strip.text.y = element_text(angle = 180),
strip.placement = "outside", panel.spacing.y = unit(0, "cm"))
#> `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
由reprex package (v0.2.0) 于 2018 年 7 月 19 日创建。
【讨论】:
我可以指定子图的顺序,比如先杂色,然后是setosa,再到virginica? 当然,你可以随意设置休息时间 @CecilyMag 我只是回头一看,意识到你的意思是安排方面,而不是休息。您可以通过将Species
设置为一个因子(如果还没有),然后更改因子级别的顺序【参考方案2】:
仅供参考,最好发布您的数据而不是屏幕截图,并且您还应该发布您迄今为止尝试过的代码。
你要找的是facet_grid
:
library(tidyverse)
iris_summarized <- iris %>%
group_by(Species, Sepal.Length) %>%
summarize(total = n())
ggplot(iris_summarized, aes(x = Sepal.Length, y = total, fill = Species)) + # the fill argument sets the color for the bars
geom_col() + # use geom_col instead of geom_bar if you are explicitly referencing counts in your data set
facet_grid(Species ~ ., switch = "y") + # the switch = "y" argument moves the species name to the left side of the graph
theme(strip.placement = "outside", # this moves the title of each facet to the left of the axis
strip.background = element_blank()) # this makes the title of each facet not have a background
【讨论】:
但是我需要 x 轴是不同的变量名而不仅仅是 sepal.length,我怎样才能做到这一点 你想让x轴有多个变量吗?不太明白你的意思。 . .以上是关于如何连接条形图,就像 geom_density_ridges 对直方图所做的那样的主要内容,如果未能解决你的问题,请参考以下文章