ggplot2 geom_points не будет окрашивать или уворачиваться - PullRequest
0 голосов
/ 24 апреля 2020

Так что я использую ggplot2 для построения как гистограммы, так и точек. В настоящее время я получаю это: enter image description here

Как вы можете видеть, полосы хорошо разделены и окрашены в нужные цвета. Однако мои очки неокрашены и уложены друг на друга. Мне бы хотелось, чтобы точки были над их обозначенной полосой и были одного цвета.

  #Add bars
  A <- A + geom_col(aes(y = w1, fill = factor(Species1)), 
                    position = position_dodge(preserve = 'single'))

  #Add colors
  A <- A + scale_fill_manual(values = c("A. pelagicus"= "skyblue1","A. superciliosus"="dodgerblue","A. vulpinus"="midnightblue","Alopias sp."="black"))

  #Add points
  A <- A + geom_point(aes(y = f1/2.5), 
                      shape= 24, 
                      size = 3,
                      fill = factor(Species1), 
                      position = position_dodge(preserve = 'single'))

  #change x and y axis range
  A <- A + scale_x_continuous(breaks = c(2000:2020), limits = c(2016,2019))
  A <- A + expand_limits(y=c(0,150))

  # now adding the secondary axis, following the example in the help file ?scale_y_continuous
  # and, very important, reverting the above transformation
  A <- A + scale_y_continuous(sec.axis = sec_axis(~.*2.5, name = " "))

  # modifying axis and title
  A <- A + labs(y = " ",
                x = " ")
  A <- A + theme(plot.title = element_text(size = rel(4)))
  A <- A + theme(axis.text.x = element_text(face="bold", size=14, angle=45),
            axis.text.y = element_text(face="bold", size=14))
  #A <- A + theme(legend.title = element_blank(),legend.position = "none")
  #Print plot
  A

При запуске этого кода я получаю следующую ошибку:

Ошибка: неизвестное имя цвета: A . pelagicus Дополнительно: Предупреждающие сообщения: 1: Ширина не определена. Устанавливается с position_dodge(width = ?) 2: в max (таблица (панель $ xmin)): нет не пропущенных аргументов для max; возвращение -Inf

Я пробовал пару вещей, но не могу понять, что это работает для geom_col, а не для geom_points.

Заранее спасибо

1 Ответ

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

Две основные проблемы, которые у вас есть c, касаются вашей цветовой ошибки и не уклонения, и их можно решить, отформатировав аргумент scale_...(values=, используя список вместо вектора, и применив group= эстетика c, соответственно.

Вы увидите ответ на эти два вопроса на примере:

# dummy dataset
year <- c(rep(2017, 4), rep(2018, 4))
species <- rep(c('things', 'things1', 'wee beasties', 'ew'), 2)
values <- c(10, 5, 5, 4, 60, 10, 25, 7)
pt.value <- c(8, 7, 10, 2, 43, 12, 20, 10)
df <-data.frame(year, species, values, pt.value)

Я установил «значения» для своего столбца heights и я хотел использовать другую y aestheti c для очков в иллюстративных целях, называемую «pt.value». В остальном настройка данных аналогична вашей. Обратите внимание, что df$year будет установлен как цифра c, поэтому лучше поменять его на формат даты (вроде бы больше проблем, чем здесь стоит), либо просто как фактор, поскольку «2017.5» не будет слишком большой смысл здесь :). Дело в том, что мне нужно, чтобы «год» был дискретным, а не непрерывным.

Решите цветовую ошибку

Для графика я постараюсь создать его похожим на вас. Обратите внимание, что в объекте scale_fill_manual необходимо установить аргумент values= , используя список . В вашем примере кода вы используете вектор (c()) для указания цветов и именования. Если у вас есть name1=color1, name2=color2,..., это представляет структуру списка.

ggplot(df, aes(x=as.factor(year), y=values)) + 
    geom_col(aes(fill=species), position=position_dodge(width=0.62), width=0.6) + 
    scale_fill_manual(values=
        list('ew' = 'skyblue1', 'things' = 'dodgerblue',
            'things1'='midnightblue', 'wee beasties' = 'gray')) +
    geom_point(aes(y=pt.value), shape=24, position=position_dodge(width=0.62)) +
    theme_bw() + labs(x='Year')

enter image description here

Таким образом, цвета применяются правильно, а моя ось дискретна, и значения у точек отображаются на pt.value, как я и хотел, но почему бы точкам не уклоняться?!

Решить проблему уклонения

Уклонение - забавная вещь в ggplot2. Лучшее объяснение, которое я могу вам здесь дать, заключается в том, что для столбцов и столбчатых диаграмм уклонение является своего рода «встроенным» в geom, поскольку положение по умолчанию - «stack», а «dodge» представляет альтернативный метод для рисования geom. Для точек, текста, надписей и других по умолчанию используется позиция «идентичность», и вам нужно более четко указать, как они собираются уклоняться, или они просто не уклоняются вообще.

По сути, мы нужно сообщить точкам , на что они уклоняются на основе. Это "виды"? С geom_col предполагается, что с, но с geom_point вам нужно указать. Мы делаем это с помощью group= aestheti c, который позволяет geom_point знать, что использовать в качестве критерия уклонения. Когда вы добавляете это, это работает!

ggplot(df, aes(x=as.factor(year), y=values, group=species)) + 
    geom_col(aes(fill=species), position=position_dodge(width=0.62), width=0.6) + 
    scale_fill_manual(values=
        list('ew' = 'skyblue1', 'things' = 'dodgerblue',
            'things1'='midnightblue', 'wee beasties' = 'gray')) +
    geom_point(aes(y=pt.value), shape=24, position=position_dodge(width=0.62)) +
    theme_bw() + labs(x='Year')

enter image description here

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