首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >增加geom_line()堆栈之间的距离

增加geom_line()堆栈之间的距离
EN

Stack Overflow用户
提问于 2020-06-25 11:44:04
回答 1查看 137关注 0票数 0

我有一些来自XRD的衍射数据。我想把所有这些都画在一个图表里,但要堆叠起来。因为y的范围很大,所以堆叠并不是那么直接。如果你想玩,这里有一个数据链接,下面是简单的脚本

https://www.dropbox.com/s/b9kyubzncwxge9j/xrd.csv?dl=0

代码语言:javascript
运行
复制
library(dplyr)
library(ggplot2)
#load it up
xrd <- read.csv("xrd.csv")
#melt it

xrd.m = melt(xrd, id.var="Degrees_2_Theta")
# Reorder so factor levels are grouped together

xrd.m$variable = factor(xrd.m$variable, 
                        levels=sort(unique(as.character(xrd.m$variable))))
names(xrd.m)[names(xrd.m) == "variable"] <- "Sample"
names(xrd.m)[names(xrd.m) == "Degrees_2_Theta"] <- "angle"

#colours use for nearly everything

cbPalette <- c("#000000", "#E69F00", "#56B4E9", "#009E73", "#F0E442", "#0072B2", "#D55E00", "#CC79A7")

#plot
ggplot(xrd.m, aes(angle, value, colour=Sample, group=Sample)) +
  geom_line(position = "stack") +
  scale_colour_manual(values=cbPalette) +
  theme_linedraw() +
  theme(legend.position = "none",  
        axis.text.y=element_blank(),
        axis.ticks.y=element_blank()) + 
  labs(x="Degrees 2-theta", y="Intensity - stacked for clarity")  

Here is the plot- as you can see it's not quite stacked

Here is something I had in excel a way back. ugly - but slightly better

我不确定我是否真的会使用R中的堆叠图功能,因为我发现它总是与过去的经验不同,可能会使用我在excel中使用的相同数据操作。

EN

回答 1

Stack Overflow用户

发布于 2020-06-25 12:55:34

似乎您对在geom_line()上应用position="stack"的结果与实际发生的情况有不同的理解。您希望做的事情可能最好是使用刻面或创建脊线图。我将在这里通过一些示例数据为您提供这两种方法的解决方案(对不起,我没有单击dropbox链接,它们最终都会断开)。

position="stack"实际上是做什么的?

position="stack"的结果将是每一行的y值将在结果图中相加或“堆叠”在一起。这意味着绘制的线条实际上只会准确地反映其中一条线的数据中的实际值,而另一条线将被“添加”到该线的“顶部”(堆叠)。这个行为通过一个例子得到了最好的说明:

代码语言:javascript
运行
复制
ex <- data.frame(x=c(1,1,2,2,3,3), y=c(1,5,1,2,1,1), grp=rep(c('A','B'),3))
ggplot(ex, aes(x,y, color=grp)) + geom_line()

在x的所有值中,"A“的y值都等于1。这与指示position="identity"相同。现在,让我们看看如果使用position="stack"会发生什么

代码语言:javascript
运行
复制
ggplot(ex, aes(x,y, color=grp)) + geom_line(position="stack")

您应该看到,为"B“绘制的y值等于B,而"A”的y值实际上是"A“的值与"B”的值相加。希望这是有意义的。

刻面

你要做的就是把你的重叠线垂直“分开”,对吧?这并不完全是堆叠,因为您可能希望将它们的y值保持为position="identity" (默认值)。一种很容易做到这一点的方法是使用刻面,它根据数据集中的一个或两个变量创建所谓的“堆叠图”。在本例中,我使用的是示例数据(出于上述原因),但您可以使用它来理解您希望如何排列自己的数据。

代码语言:javascript
运行
复制
set.seed(1919191)
df <- data.frame(
  x=rep(1:100, 5),
  y=c(rnorm(100,0,0.1), rnorm(100,0,0.2), rnorm(100,0,0.3), rnorm(100,0,0.4), rnorm(100,0,0.5)),
  sample_name=c(rep('A',100), rep('B',100), rep('C',100), rep('D',100), rep('E',100)))

# plot code
p <- ggplot(df, aes(x,y, color=sample_name))
p + geom_line() + facet_grid(sample_name ~ .)

创建脊线图

做同样事情的另一种方式是创建一个ridgeline plot。您可以通过ggridges包完成此操作,下面是一个使用geom_ridgeline()的示例

代码语言:javascript
运行
复制
p + geom_ridgeline(
    aes(y=sample_name, height=y),
    fill=NA, scale=1, min_height=-Inf)

这里的想法是理解geom_ridgeline()将y轴更改为分组变量(因此我们实际上必须在aes()中重新定义),并且应该将每个组的实际y值赋给height=美学。如果您的数据的y值为负(现在是height=值),那么您还需要设置min_height=,否则默认情况下会将其截断为0。您还可以通过玩scale=来更改每个组的分隔程度(顺便说一句,并不总是以您认为的方式更改)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62567530

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档