Оси в стиле R с ggplot - снова

У меня есть тот же вопрос, который был опубликован здесь ранее: оси R-стиля с ggplot. Я попробовал решение, предложенное baptiste:

library(ggplot2)

d <- data.frame(x=1:10, y=rnorm(10))

base_breaks_x <- function(x){
  b <- pretty(x)
  d <- data.frame(y=-Inf, yend=-Inf, x=min(b), xend=max(b))
  list(geom_segment(data=d, aes(x=x, y=y, xend=xend, yend=yend)),
       scale_x_continuous(breaks=b))
}
base_breaks_y <- function(x){
  b <- pretty(x)
  d <- data.frame(x=-Inf, xend=-Inf, y=min(b), yend=max(b))
  list(geom_segment(data=d, aes(x=x, y=y, xend=xend, yend=yend)),
       scale_y_continuous(breaks=b))
}

ggplot(d, aes(x,y)) +
  geom_point() +
  theme_bw() +
  opts(panel.border = theme_blank(),
       panel.grid.major = theme_blank(),
       panel.grid.minor = theme_blank()) +
  base_breaks_x(d$x) +
  base_breaks_y(d$y)

и обнаружил, что это работает только тогда, когда эстетика сюжета состоит только из aes(x,y). Рисование данных из фрейма, в котором один столбец содержит коэффициент, с помощью которого изменяется цвет, например

d <- data.frame(x=1:10, y=rnorm(10),name=rep(c("blue","red"),5))
ggplot(d, aes(x,y,colour=name))+ ...

выдает сообщение об ошибке

"Error in eval(expr, envir, enclos) : object 'name' not found"

Как можно решить эту проблему?

Большое спасибо за Вашу помощь!

1 ответ

Решение

Вы получили эту ошибку, потому что вы установили colour=name внутри ggplot() позвонить и base_breaks_x() а также base_breaks_y() содержит geom_segment() звонки, которые также пытаются найти переменную name внутри фреймов данных этих функций. Есть два способа решения проблемы.

Во-первых, двигаться colour=name от ggplot() в aes() из geom_point(),

ggplot(d, aes(x,y)) +
  geom_point(aes(colour=name))

Во-вторых, изменить функции base_breaks_x() а также base_breaks_y() добавляя inherit.aes=FALSE внутри geom_segment() звонки.

geom_segment(data=d, aes(x=x, y=y, xend=xend, yend=yend),inherit.aes=FALSE)
Другие вопросы по тегам