Как изменить ширину одного boxplot в boxplot с несколькими группами / условием? - PullRequest
0 голосов
/ 29 апреля 2020

Я новичок в R и пытаюсь создать коробку, показывающую накопление опухоли определенного продукта в разные моменты времени, для двух разных состояний. Я придумал следующее изображение:

Boxplot с несколькими группами + условие

Я использовал этот код:

ggplot(tumor, aes(x=time_point, y=IA, fill=condition)) + ggtitle ("Tumor accumulation") + xlab("Time post-injection (h)") + ylab("%IA/kg") + geom_boxplot()+ geom_point(position=position_jitterdodge(0))+ scale_x_discrete(limits=c("2", "24", "96", "144")) + scale_fill_brewer(palette="Paired") + theme_minimal() + expand_limits(y=0)

Поскольку нет данных для условия C1 и момента времени 144 ч, крайний правый прямоугольник выглядит намного больше. Кажется, я не могу понять, как изменить ширину этого единственного блока, не меняя остальное.

1 Ответ

1 голос
/ 29 апреля 2020

Это должно помочь вам. Во-первых, позвольте мне использовать примерный набор данных и примерный блокпост:

df <- data.frame(
    samplename=c(rep("A", 10), rep("B1", 10), rep("B2", 10)),
    grp=c(rep("Group A", 10), rep("Group B", 20)),
    y=c(rnorm(10), rnorm(10, 0.2), rnorm(10, 0.35, 0.1))
)

ggplot(df, aes(grp, y)) +
    geom_boxplot(aes(fill=grp, group=samplename))

enter image description here

Это дает вам график, похожий на ваш пример. Поле слева расширяется, чтобы заполнить всю x эстету c, тогда как поля справа разделяются (официальный термин «уклонен»), так что сумма B1 + B2 = ширина B.

Чтобы исправить это, вы можете использовать аргумент preserve='single', включенный в функцию position_dodge(), который должен применяться к аргументу position= geom_boxpot. Вот что я имею в виду:

ggplot(df, aes(grp, y)) +
    geom_boxplot(aes(fill=grp, group=samplename),
        position=position_dodge(preserve='single'))

enter image description here

Это устраняет проблему ширины, делая все отдельные поля (уклоненные или нет) одинаковой ширины, но это также означает, что поле, принадлежащее «Группе А», все еще уклонено слева. Это была проблема, прежде чем она была исправлена ​​добавлением position_dodge2() (Mov ie Subtitle: «Возвращение position_dodge!»). Простая замена на position_dodge() устраняет эту проблему, и все поля выровнены по значениям их оси x:

ggplot(df, aes(grp, y)) +
    geom_boxplot(aes(fill=grp, group=samplename),
        position=position_dodge2(preserve='single'))

enter image description here

...