简体   繁体   中英

How to connect data points (for each subject) on a plot in R?

I'm plotting each subject's proportion of responses to "same" or "different" stimuli across two blocks (A block and B block), meaning that each subject has 4 data points plotted. Two for A block (same and different) and two for B block (same and different). Also means there are 4 rows of data containing proportion of responses for each subject.

I would like to connect each subject's "same" and "different" data points with a line WITHIN a block (eg their one datapoint for "same" and datapoint for "different" are connected via a line within the A block and within the B block for each subject).

I tried using the "group = subject" that comes with geom_line(), but it connects ALL of the subject's data points when I would like to only connect data points within each block.

testplot <- ggplot(df, aes(x=block, y=prop, shape=con, colour=con)) +
  geom_point(position=position_dodge(width=.1)) +
  xlab("Block") + ylab("Prop of responses") +
  theme_bw(base_size = 13) +
  theme(legend.position="top")
plot(testplot)

sample dataset:

subj = c(1, 1, 2, 2, 3, 3, 4, 4, 1, 1, 2, 2, 3, 3, 4, 4)
prop = c(0.5, 0.8, 0.3, 0.7, 0.9, 0.4, 0.1, 0.5, 1, 0.5, 0.9, 0.2, 0.7, 0.4, 0.8, 0.1)
con = c("same", "same", "same", "same", "same", "same", "same", "same", "diff", "diff", "diff", "diff", "diff", "diff", "diff", "diff")
block = c("A", "B", "A", "B", "A", "B", "A", "B", "A", "B", "A", "B", "A", "B", "A", "B")

df = data.frame(subj, prop, con, block)

I hope this makes sense, is this feasible? Any help is appreciated!

I think the best approach is with a facet_grid :

ggplot(df, aes(x=con, y=prop, shape=con)) +
  geom_point(aes(color=con), position=position_dodge(width=.1)) +
  geom_line(aes(group = subj)) +
  facet_grid(.~block) +
  xlab("Block") + ylab("Prop of responses") +
  theme_bw(base_size = 13) +
  theme(legend.position="top")

在此处输入图像描述

From looking at the other answers here, I perhaps misinterpreted, but I think this is possibly a clearer representation anyway:

ggplot(df, aes(factor(subj), prop)) +
  geom_point(aes(fill = con), size = 3, shape = 21) +
  geom_line(aes(group = factor(subj))) +
  facet_grid(.~block, switch = "x") +
  scale_x_discrete(expand = c(2, 2)) +
  labs(x = "Subjects within block") +
  theme_classic() +
  theme(text = element_text(size = 12),
        strip.placement = "outside",
        strip.background = element_blank(),
        panel.grid.major.y = element_line(colour = "gray90"))

在此处输入图像描述

One approach to achieve your desired plot would be to use facet_wrap by block , map con on x and subj on group . Try this:

subj = c(1, 1, 2, 2, 3, 3, 4, 4, 1, 1, 2, 2, 3, 3, 4, 4)
prop = c(0.5, 0.8, 0.3, 0.7, 0.9, 0.4, 0.1, 0.5, 1, 0.5, 0.9, 0.2, 0.7, 0.4, 0.8, 0.1)
con = c("same", "same", "same", "same", "same", "same", "same", "same", "diff", "diff", "diff", "diff", "diff", "diff", "diff", "diff")
block = c("A", "B", "A", "B", "A", "B", "A", "B", "A", "B", "A", "B", "A", "B", "A", "B")

df = data.frame(subj, prop, con, block)

library(ggplot2)

testplot <- ggplot(df, aes(x=con, y=prop, group = subj)) +
  geom_point(aes(shape=con, colour=con)) +
  geom_line() +
  xlab("Block") + ylab("Prop of responses") +
  theme_bw(base_size = 13) +
  theme(legend.position="top") +
  facet_wrap(~block, strip.position = "bottom") +
  theme(strip.placement = "outside", axis.text.x = element_blank(), axis.ticks.x = element_blank())
testplot

This answer is very similar to the one by Ian Cambell but with colour and shape used to represent the subject since the same/diff is shown on the x-axis and is therefore redundant in the legend. With the subjects easily identifiable, the plot is also similar to the one by Allan Cameron. Just to show another perspective.

ggplot(df, aes(x=con, y=prop, col=subj, shape=subj)) +
  geom_point() +
  geom_line(aes(group = subj)) +
  facet_grid(.~block) +
  xlab("Block") + ylab("Prop of responses") +
  theme_bw(base_size = 13) +
  theme(legend.position="top")

在此处输入图像描述

We can then compare the four subjects across the blocks (facets).

These are all good suggestions and interesting ideas if you want to reconsider your data representation (facets in particular), but to actually answer your question, you want to paste the groups together, as in geom_line(aes(group=paste(subj, con)))

ggplot(df, aes(x=block, y=prop, shape=con, colour=con)) +
  geom_point() +
  geom_line(aes(group=paste(subj, con))) +
  xlab("Block") + ylab("Prop of responses") +
  theme_bw(base_size = 13) +
  theme(legend.position="top")

结果图

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM