您好,我有一个更大的数据帧,但示例虚拟df如下所示:

set.seed(23)
df = data.frame(name = c(rep("Bob",8),rep("Tom",8)),
                topic = c(rep(c("Reading","Writing"),8)),
                subject = c(rep(c("English","English","Spanish","Spanish"),4)),
                exam = c(rep("First",4),rep("Second",4),rep("First",4),rep("Second",4)),
                score = sample(1:100,16))

我必须用下图所示的方式绘制它(对于我的原始数据框),但用线连接了Exam变量中第一和第二类之间每个名称对应的分数,我try 了geom_line(aes(group=name)),但这些线的连接方式不正确.有没有办法连接同样尊重fill变量分组的点,就像position_dodge()帮助分隔点的填充分组一样?非常感谢!

library(ggplot2)
df %>% ggplot(aes(x=topic,y=score,fill=exam)) +
    geom_boxplot(outlier.shape = NA) + 
    geom_point(size=1.75,position = position_dodge(width = 0.75)) +
    facet_grid(~subject,switch = "y")

enter image description here

推荐答案

要达到你想要的效果,一种 Select 是在nametopic之前将线条设为group,然后手动躲避线条,而不是依赖于position_dogde.为此,将topic转换为geom_line的数字,并将位置移位必要的量,以使线与遮挡的点对齐:

set.seed(23)
df <- data.frame(
  name = c(rep("Bob", 8), rep("Tom", 8)),
  topic = c(rep(c("Reading", "Writing"), 8)),
  subject = c(rep(c("English", "English", "Spanish", "Spanish"), 4)),
  exam = c(rep("First", 4), rep("Second", 4), rep("First", 4), rep("Second", 4)),
  score = sample(1:100, 16)
)

library(ggplot2)

ggplot(df, aes(x = topic, y = score, fill = exam)) +
  geom_boxplot(outlier.shape = NA) +
  geom_point(size = 1.75, position = position_dodge(width = 0.75)) +
  geom_line(aes(
    x = as.numeric(factor(topic)) + .75 / 4 * ifelse(exam == "First", -1, 1),
    group = interaction(name, topic)
  )) +
  facet_grid(~subject, switch = "y")

R相关问答推荐

如何将标签移动到堆叠甜甜圈图表中每个切片的边缘?

创建计数(带重置)变量

返回句子中最长的偶数长单词

使用facet_wrap()时如何将面板标题转换为脚注?

在R中使用自定义函数时如何删除该函数的一部分?

geom_raster不适用于x比例中超过2,15的值

如何在弹性表中为类别值的背景上色

高质量地将R格式的图表从Word中输出

根据收件箱中的特定值提取列名

R:连接值,而不是变量?

更改默认系列1以更改名称

然后根据不同的列值有条件地执行函数

将小数分隔符放在R中的前两位数字之后

R—将各种CSV数字列转换为日期

打印XTS对象

以字符格式导入的ExcelElectron 表格日期列标题

汇总数据的Sheffe检验的P值(平均值和标准差)

从R中发出的咕噜声中的BUG?

使用R将简单的JSON解析为嵌套框架

SHILINY中DT列的条件着色