несоответствие geom_line при построении нескольких линий - PullRequest
0 голосов
/ 04 мая 2020

Я пытаюсь построить четыре линии в одном графике GGPlot2. Проблема заключается в том, что, без видимой причины, при построении нескольких линий данные смешиваются.

Когда я строю одну строку (строка 4.), это выглядит так:

enter image description here

Но та же самая линия при нанесении вместе с группой линий выглядит совершенно иначе:

enter image description here

Мы Можно видеть, что тип линии 3. теперь представляет строку 4 (= форма линии 4 совершенно иная).

Поскольку эта проблема кажется мне действительно запутанной, я включаю соответствующие части кода:

# a single line (number 4) plot
p <- ggplot(data = mean_df, aes(x = foo)) +
  geom_line(aes(y = .data[["4"]]), size=1.2) +
  ylab("y") +
  xlab("x")

print(p)

# multiple lines plot
p <- ggplot(data = mean_df, aes(x = foo)) +
  geom_line(aes(y = .data[["1"]], linetype="dotted"), size=1.1) +
  geom_line(aes(y = .data[["2"]], linetype="twodash"), size=1.1) +
  geom_line(aes(y = .data[["3"]], linetype="longdash"), size=1.1) +
  geom_line(aes(y = .data[["4"]], linetype="solid"), size=1.1) +
  labs(
    title="",
    linetype="Z"
  ) +
  xlab("x") +
  ylab("y") +
  scale_linetype_manual(name="Z", values=c("dotted", "twodash", "longdash", "solid"), labels=c("1", "2", "3", "4")) +
  guides(linetype = guide_legend(override.aes = list(size = 2)))

print(p)

Форма фрейма данных (mean_df) состоит из 5 столбцов, все ячейки имеют числовые значения c.

x <- list(0.00000000, 0.06666667, 0.13333333, 0.20000000, 0.26666667, 0.33333333, 0.40000000, 0.46666667, 0.53333333, 0.60000000, 0.66666667, 0.73333333, 0.80000000, 0.86666667, 0.93333333, 1.00000000)
col1 <- list(0.07158121, 0.09441034, 0.11920243, 0.14119030, 0.17993894, 0.20329103, 0.27479900, 0.44655523, 0.58079973, 0.62923797, 0.65742297, 0.68274665, 0.73551633, 0.91081992, 0.88468318, 0.91770913)
col2 <- list(0.01226280, 0.09927955, 0.07809336, 0.09356798, 0.13873392, 0.21159535, 0.34069621, 0.47930396, 0.59753322, 0.64535698, 0.54105539, 0.53885464, 0.74917172, 0.91578496, 0.92687179, 0.93211675)
col3 <- list(0.05849679, 0.12701451, 0.10779754, 0.12351629, 0.14365027, 0.15020727, 0.33345780, 0.48881116, 0.66081110, 0.70052420, 0.70143050, 0.65706529, 0.81447223, 0.91351115, 0.95472268, 0.94854747)
col4 <- list(0.04979115, 0.08789403, 0.06288537, 0.13375946, 0.18554486, 0.19794996, 0.25361769, 0.30654542, 0.51325469, 0.50892014, 0.52454547, 0.55476019, 0.62278916, 0.84428246, 0.88896150, 0.84863063)

mean_df <- data.frame(foo = x, 1 = col1, 2 = col2, 3 = col3, 4 = col4)

print(mean_df)

    foo   `1`    `2`    `3`    `4`
 1  0      0.0716 0.0123 0.0585 0.0498
 2  0.0667 0.0944 0.0993 0.127  0.0879
 3  0.133  0.119  0.0781 0.108  0.0629
 4  0.2    0.141  0.0936 0.124  0.134 
 5  0.267  0.180  0.139  0.144  0.186 
 6  0.333  0.203  0.212  0.150  0.198 
 7  0.4    0.275  0.341  0.333  0.254 
 8  0.467  0.447  0.479  0.489  0.307 
 9  0.533  0.581  0.598  0.661  0.513 
10  0.6    0.629  0.645  0.701  0.509 
11  0.667  0.657  0.541  0.701  0.525 
12  0.733  0.683  0.539  0.657  0.555 
13  0.8    0.736  0.749  0.814  0.623 
14  0.867  0.911  0.916  0.914  0.844 
15  0.933  0.885  0.927  0.955  0.889 
16  1      0.918  0.932  0.949  0.849 

Задавать вопрос вроде тривиально, но потратив четыре часа на эту проблему без какого-либо прогресса мне пришлось опубликовать этот вопрос. Извините, если есть какое-то самоочевидное решение для этого ...

1 Ответ

2 голосов
/ 04 мая 2020

Вы намеревались изначально создать столбцы в виде списков? Я предположил иначе. Вместо этого я использовал их в качестве входных данных для значений столбцов в кадре данных. Независимо от того, строю я график col4 по отдельности или вместе с другими, я не вижу никакой разницы.

Кроме того, вам в идеале придется преобразовать ваши данные в «длинный» формат, используя pivot_longer(), прежде чем вы начертите все линии вместо того, чтобы использовать geom_line() четыре раза.

library(tidyverse)
library(ggplot2)

mean_df <- tibble(foo = c(0.00000000, 0.06666667, 0.13333333, 0.20000000, 0.26666667, 0.33333333, 0.40000000, 0.46666667, 0.53333333, 0.60000000, 0.66666667, 0.73333333, 0.80000000, 0.86666667, 0.93333333, 1.00000000),
                  col1 = c(0.07158121, 0.09441034, 0.11920243, 0.14119030, 0.17993894, 0.20329103, 0.27479900, 0.44655523, 0.58079973, 0.62923797, 0.65742297, 0.68274665, 0.73551633, 0.91081992, 0.88468318, 0.91770913),
                  col2 = c(0.01226280, 0.09927955, 0.07809336, 0.09356798, 0.13873392, 0.21159535, 0.34069621, 0.47930396, 0.59753322, 0.64535698, 0.54105539, 0.53885464, 0.74917172, 0.91578496, 0.92687179, 0.93211675),
                  col3 = c(0.05849679, 0.12701451, 0.10779754, 0.12351629, 0.14365027, 0.15020727, 0.33345780, 0.48881116, 0.66081110, 0.70052420, 0.70143050, 0.65706529, 0.81447223, 0.91351115, 0.95472268, 0.94854747),
                  col4 = c(0.04979115, 0.08789403, 0.06288537, 0.13375946, 0.18554486, 0.19794996, 0.25361769, 0.30654542, 0.51325469, 0.50892014, 0.52454547, 0.55476019, 0.62278916, 0.84428246, 0.88896150, 0.84863063))
mean_df

# plotting column 4
ggplot(data = mean_df, aes(x = foo)) +
  geom_line(aes(y = col4), size=1.2) +
  ylab("y") +
  xlab("x")

enter image description here

# plotting all of them

mean_df %>%
  pivot_longer(cols = starts_with("col"),
               names_to = "Column Name",
               values_to = "Column Values") %>%
  ggplot(aes(x = foo)) +
  geom_line(aes(y = `Column Values`, 
                col = `Column Name`), size=1.2) +
  scale_color_manual(values = c("Grey","Grey","Grey","Black"))

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...