首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >部分虚线ggplot

部分虚线ggplot
EN

Stack Overflow用户
提问于 2020-04-28 03:02:56
回答 2查看 2.1K关注 0票数 3

我是R的新手,并且已经成功地在ggplot中创建了一个多线图形。沿着x轴,我有5个时间点,它们是离散的度量。我希望后半部分的线条图是虚线(见附图),有人能帮我编辑我目前的代码来实现这一点吗?任何帮助都将不胜感激。提前谢谢你!

代码语言:javascript
复制
ggplot(longdata, aes(x = Time, y = Strength, colour = Group)) +
  stat_summary(fun  = mean,
               geom = "point",)+ 
  stat_summary(fun = mean,
               geom = "line", 
               aes(group = Group), size =1,
               show.legend = FALSE) + 
               geom = "errorbar",
               width = .1, alpha = 0.3) +
  xlab("Testing Timepoint") +
  ylab("Isometric Strength (N.m)") +
  bbtheme +
  scale_colour_manual(name = "Group",
                      labels = c("Once-weekly", "Twice-weekly"),
                      values = c("red1", "navyblue")) +
  expand_limits(y = 0)
EN

回答 2

Stack Overflow用户

发布于 2020-04-28 03:50:46

以下是一种建议的方法。建议您为将来的问题发布数据集或示例数据集,以便更容易为您的问题提供解决方案。粘贴dput(your.data.frame)的输出是在这里共享数据帧的最佳方法之一。

话虽如此,下面是一个示例数据集。我们将用它画一张线条图。

代码语言:javascript
复制
df <- data.frame(x=1:10, y=1:10)
p <- ggplot(df, aes(x,y)) + theme_bw()
p + geom_line()

真的很神奇。假设您想拆分该行,使其在x=5之后是虚线,在x=5之前是实线。您可以:

  1. 在数据集中创建另一列,并在该列上映射linetype的美学(这是首选选项),或者
  2. 设置内联语句以映射linetype的美学。不太受欢迎,但也很有效。

我们将做上面的#2,因为它足够简单。这样的东西是可以工作的:

代码语言:javascript
复制
p + geom_line(aes(linetype=eval(x>5)))

废话。它“起作用了”,但你现在有了一个差距。ggplot正在绘制点之间的线,所以如果一个点包含在一个集合中,那么它就不在另一个集合中。我在x=1和x=4之间画了一条实线,然后在x=5和x=10之间画了一条虚线。我们想让它在x=1和x=5之间画一条实线,然后在x=5和x=10之间画一条虚线。你现在看到问题了吗?我们需要将x=5包含在这两个集合中。

这里的解决方案是我们需要两个对geom_line的调用。也许还有另一种方法,但这就是我要做的:

代码语言:javascript
复制
p + geom_line(data=subset(df, x<=5), linetype=1) +
    geom_line(data=subset(df, x>=5), linetype=2)

这招奏效了。现在,如果要添加具有某些标签的图例,则需要在ggplot中指定“我要为线型添加图例”。要做到这一点,可以在每个geom_line调用的aes()中包含linetype=。然后,您可以通过scale_linetype_manual手动指定该图例的各个方面。如下所示:

代码语言:javascript
复制
p + geom_line(data=subset(df, x<=5), aes(linetype='solid line')) +
    geom_line(data=subset(df, x>=5), aes(linetype='dotted line')) +
    scale_linetype_manual('type of line', values=c(2,1))

编辑:处理非数字x轴?

在您的说明之后,我将在这里将u/jpsmith包含在他们的响应中的内容合并到这里,即如何处理非数字x轴。正如@jpsmith指出的那样,您需要在那里使用stat_summary,因为如果您尝试使用它,geom_line会发出警告。首先确保您的x轴值是一个因子,然后提取levels(longdata$Time)。您可能首先希望确保levels(longdata$Time)的顺序是正确的,但从您显示的绘图中可以看出它是正确的。然后,为每种类型的行准备包含点可能是值得的,确保在两个集合中都包含"Post“:

代码语言:javascript
复制
solid.line.points <- c('Pre', 'Mid', 'Post')
dashed.line.points <- c('Post', 'Mid.detraining', 'Post.detraining')

然后,使用stat_summary,就像@jpsmith发布的那样。不过,请注意应用于您的案例的一些关键更改:

代码语言:javascript
复制
stat_summary(data=subset(df,Time %in% solid.line.points),
    fun=mean, geom="line",
    inherit.aes=FALSE, aes(x=Time, y=Strength, linetype='solid line')) +
stat_summary(data=subset(df,Time %in% dashed.line.points),
    fun=mean, geom="line",
    inherit.aes=FALSE, aes(x=Time, y=Strength, linetype='dashed line'))

您需要应用group=美学,我相信您在longdata数据集中使用的组在这里可能不起作用……或者它可能,不确定。这就是为什么我建议覆盖这两个stat_summary调用中的美学,并为每个调用指定group=。如果在绘制线条时遇到问题,您可能需要为一条线指定group=1,为另一条线指定group=2 (我还没有尝试过,因为我没有您的数据集)。有关将geom_line与离散x轴一起使用的说明,以及有关group=美学的说明,请参阅See the answer on this question in SO

另请注意,我设置了fun=mean。我假设你正在你的点集合的mean之间画一条线...但您最好知道要在那里绘制什么,以确保映射正确的y值。

票数 7
EN

Stack Overflow用户

发布于 2020-04-28 08:39:22

在@chemdork123建议的基础上构建,但考虑到您的非数字X轴,您可以使用stat_summary (您还需要在aes()中添加一个group=1

代码语言:javascript
复制
library(ggplot2)
df <- data.frame(x=LETTERS[1:10], y=1:10)
ggplot(df, aes(x,y, group=1)) +
  stat_summary(data=subset(df,x %in% c("E","F","G","H","I","J")), fun.y=sum, geom="line", aes(linetype='solid line')) +
  stat_summary(data=subset(df,x %in% c("A","B","C","D","E")), fun.y=sum, geom="line", aes(linetype='dashed line'))

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

https://stackoverflow.com/questions/61466437

复制
相关文章

相似问题

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