Построение нескольких переменных X для одной непрерывной переменной Y на одном графике

Я пытаюсь нарисовать линейный график с двумя переменными x в x-axis с одной непрерывной переменной y в y-axis. Количество x1 и x2 отличается. df выглядит следующим образом:

df <- structure(list(val = c(3817,2428,6160,6729,7151,7451,6272,7146,7063,6344,5465,6169,7315,6888,7167,6759,4903,6461,7010,7018,6920,3644,6541,31862,31186,28090,28488,29349,28284,25815,23529,20097,19945,22118), type = c("1wt", "1wt", "3wt", "3wt", "3wt", "5wt", "5wt", "7wt", "7wt", "7wt","10wt","10wt","10wt","15wt","15wt","20wt","20wt","25wt","25wt","25wt","30wt","30wt","30wt","20m","20m","15m","15m","15m","10m","10m","5m", "5m", "5m", "5m"), group = c("A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "B", "B", "B", "B", "B", "B", "B", "B", "B", "B", "B")), row.names = c(NA, 34L), class = "data.frame")

где переменные x -

x1 <- factor(df$type, levels = c("1wt", "3wt", "5wt", "7wt", "10wt", "15wt", "20wt", "25wt", "30wt")) и

x2 <- factor(df$type, levels = c("20m", "15m","10m","5m"))

Я хочу иметь отдельные строки для x1 и x2 с разными цветами и легендами в соответствии с df$group по оси x и df$val по оси y. не могли бы вы помочь мне сделать это? Заранее спасибо.


person temp    schedule 25.12.2018    source источник
comment
Я пытался воспроизвести, но x1 и x2 — это NA. пожалуйста, проверьте свой код еще раз.   -  person Spätzle    schedule 25.12.2018
comment
и, пожалуйста, объясните, какой тип сюжета вы пытаетесь создать: разброс? гистограмма? бары?   -  person Spätzle    schedule 25.12.2018
comment
Я пытаюсь нарисовать линейный график ... пожалуйста, опубликуйте свою попытку построения графика.   -  person Parfait    schedule 25.12.2018
comment
Мне непонятно из вопроса, какая цель. Если мы используем df как указано, с некоторой адаптацией type по оси x и val по оси y, первые две строки df показывают два числа val (3817 и 2428), связанные с одним и тем же типом (1wt). . Вы хотите показать здесь вертикальную линию или что-то другое предназначено?   -  person Jon Spring    schedule 25.12.2018
comment
@JonSpring Я хочу иметь линейный график, где для x1 и x2 будут свои линии для общего y, то есть в пределах диапазона val по оси y все x (x1 &x2) упадут и, вероятно, они будут пересекаться друг с другом. Спасибо.   -  person temp    schedule 25.12.2018
comment
@Spätzle, вы увидите некоторые NA's для x2, поскольку они имеют меньшие значения по сравнению с x1, на самом деле это мой случай, из которого мне нужно их построить. Я хочу иметь линейные графики (предпочтительно geom_quantile()/geom_smooth()), хотя любые другие значимые линейные графики в порядке... спасибо   -  person temp    schedule 25.12.2018
comment
Не могли бы вы нарисовать то, что вы ищете? Похоже, у вас есть 9 различных категорий пропускной способности (где 1 Мбит кодируется как группа A и тип 1wt) и 4 различных категории времени (где 5 м кодируется как группа B и тип 5 м). Как они должны быть сопоставлены с одной перекрывающейся осью? Должен ли 1 Мбит находиться в той же координате x, что и 20 м, а 10 Мбит (средний уровень полосы пропускания) должен находиться между 15 м и 10 м (две категории среднего времени)?   -  person Jon Spring    schedule 26.12.2018
comment
эй, @JonSpring, на самом деле мой x1 должен быть wt, а не mbit (что я исправил, извините за это)   -  person temp    schedule 26.12.2018


Ответы (1)


EDIT: добавлено ниже

Вот подход, который предполагает, что цель состоит в том, чтобы сопоставить диапазон возможных значений типа из группы A с диапазоном возможных значений из группы B.

Маркировка может быть добавлена ​​вручную, но я не думаю, что есть простой способ использовать две категориальные оси X вместе на одном графике.

df2 <- df %>%
  mutate(x = case_when(type == "1wt" ~ 0,
                       type == "3wt" ~ 1,
                       type == "5wt" ~ 2,
                       type == "7wt" ~ 3,
                       type == "10wt" ~ 4,
                       type == "15wt" ~ 5,
                       type == "20wt" ~ 6,
                       type == "25wt" ~ 7,
                       type == "30wt" ~ 8,

                       type == "20m"  ~ 0/3 * 8,
                       type == "15m"  ~ 1/3 * 8,
                       type == "10m"  ~ 2/3 * 8,
                       type == "5m"   ~ 3/3 * 8))


ggplot(df2, aes(x, val, color = group, group = group)) + 
  geom_point() +
  geom_smooth(method = lm)

введите здесь описание изображения

2-й подход

Похоже, что ОП хотел бы каким-то образом использовать значения type в числовом виде. Если они не связаны друг с другом неразрывно так, как описано, я подозреваю, что будет ошибкой изображать их так, как если бы они были связаны. (См. здесь, чтобы узнать, почему это проблема.)

Тем не менее, вот как вы могли бы это сделать. Во-первых, вот подход, который просто использует числовую часть type как есть. Обратите внимание, что «m», связанный с группой B, находится внизу, а «wt» находится вверху, связанный с группой A, как в примере, добавленном в комментарии OP ниже. Я добавил цвета к осям, чтобы прояснить это. Визуально это немного нелогично, поскольку точки, относящиеся к верхней оси, находятся внизу, и наоборот.

df2 <- df %>%
  # First, let's take the number used in "type" without adjustment
  mutate(x_unadj = parse_number(type))

ggplot(df2, aes(x_unadj, val, color = group, group = group)) + 
  geom_point() +
  geom_smooth(method = lm) + # Feel free to use other smoothing method, but
                             # not obvious to me what would be improvement.
  scale_x_continuous("m", sec.axis = sec_axis(~., name = "wt")) +
  theme(axis.text.x.bottom  = element_text(color = "#00BFC4"),
        axis.title.x.bottom = element_text(color = "#00BFC4"),
        axis.text.x.top     = element_text(color = "#F8766D"),
        axis.title.x.top    = element_text(color = "#F8766D"))

введите здесь описание изображения

Если это неудовлетворительно, мы можем изменить порядок обеих осей, используя

scale_x_reverse("m", sec.axis = sec_axis(~., name = "wt")) +

введите здесь описание изображения

Используя ggplot 3.1.0 (от октября 2018 г.), я не смог заставить вторичную ось x сместиться в направлении, противоположном основной оси. Этот пример из 2017 года больше не работает с этой версией. По состоянию на декабрь 2018 года рассматривается предлагаемое исправление, предназначенное для решения этой проблемы. .

person Jon Spring    schedule 25.12.2018
comment
Спасибо @JonSpring за это. Я не понял, как вы рассчитали type == "15m" ~ 8/3, type == "10m" ~ 2*8/3, type == "5m" ~ 8, а именно dividing by 3 and again multiplying. Эта ссылка (i.stack.imgur.com/nUCgb.png) является примером то, что я хочу иметь с простыми линиями, а не с lm, если это возможно. В основном моя цель состоит в том, чтобы построить x1 & x2 по отношению ко всем df$val (that includes all values for group A & B- should range from min at the bottom to max at the top) на оси y, или они могут быть построены как y1 и y2 с обеих сторон. Я очень ценю ваше время. - person temp; 26.12.2018