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

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)发布于 2020-04-28 03:50:46
以下是一种建议的方法。建议您为将来的问题发布数据集或示例数据集,以便更容易为您的问题提供解决方案。粘贴dput(your.data.frame)的输出是在这里共享数据帧的最佳方法之一。
话虽如此,下面是一个示例数据集。我们将用它画一张线条图。
df <- data.frame(x=1:10, y=1:10)
p <- ggplot(df, aes(x,y)) + theme_bw()
p + geom_line()

真的很神奇。假设您想拆分该行,使其在x=5之后是虚线,在x=5之前是实线。您可以:
linetype的美学(这是首选选项),或者linetype的美学。不太受欢迎,但也很有效。我们将做上面的#2,因为它足够简单。这样的东西是可以工作的:
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的调用。也许还有另一种方法,但这就是我要做的:
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手动指定该图例的各个方面。如下所示:
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“:
solid.line.points <- c('Pre', 'Mid', 'Post')
dashed.line.points <- c('Post', 'Mid.detraining', 'Post.detraining')然后,使用stat_summary,就像@jpsmith发布的那样。不过,请注意应用于您的案例的一些关键更改:
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值。
发布于 2020-04-28 08:39:22
在@chemdork123建议的基础上构建,但考虑到您的非数字X轴,您可以使用stat_summary (您还需要在aes()中添加一个group=1。
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'))

https://stackoverflow.com/questions/61466437
复制相似问题