Подтвердить что ты не робот

Более шести фигур в ggplot

Я хотел бы строить линии с разными формами с более чем шестью наборами данных, используя дискретные цвета. Проблемы: 1) создается другая легенда для цвета и формы линии, но должна быть только одна легенда с цветом и формой линии, 2) при исправлении заголовка для легенды цвета линии цвет исчезает.

t=seq(0,360,20)
for (ip in seq(0,10)) {
  if (ip==0) {
    df<-data.frame(t=t,y=sin(t*pi/180)+ip/2,sn=ip+100)
  } else {
    tdf<-data.frame(t=t,y=sin(t*pi/180)+ip/2,sn=ip+100)
    df<-rbind(df,tdf)

  }
}
head(df)

# No plot
# Error: A continuous variable can not be mapped to shape
gp <- ggplot(df,aes(x=t,y=y,group=sn,color=sn,shape=sn))
gp <- gp + labs(title = "Demo more than 6 shapes", x="Theat (deg)", y="Magnitude")
gp <- gp + geom_line() + geom_point()
print(gp)

# No plot
# Error: A continuous variable can not be mapped to shape (doesn't like integers)
gp <- ggplot(df,aes(x=t,y=y,group=sn,color=sn,shape=as.integer(sn)))
gp <- gp + labs(title = "Demo more than 6 shapes", x="Theat (deg)", y="Magnitude")
gp <- gp + geom_line() + geom_point()
print(gp)

# Gives warning about 6 shapes, and only shows 6 shapes, continous sn colors
gp <- ggplot(df,aes(x=t,y=y,group=sn,color=sn,shape=as.factor(sn)))
gp <- gp + labs(title = "Only shows six shapes, and two legends, need discrete colors", 
                x="Theat (deg)", y="Magnitude")
gp <- gp + geom_line() + geom_point()
print(gp)

# This is close to what is desired, but correct legend title and combine legends
gp <- ggplot(df,aes(x=t,y=y,group=sn,color=as.factor(sn),shape=as.factor(sn %% 6)))
gp <- gp + labs(title = "Need to combine legends and correct legend title", x="Theat (deg)", y="Magnitude")
gp <- gp + geom_line() + geom_point()
print(gp)

# Correct legend title, but now the line color disappears
gp <- ggplot(df,aes(x=t,y=y,group=sn,color=as.factor(sn),shape=as.factor(sn %% 6)))
gp <- gp + labs(title = "Color disappeard, but legend title changed", x="Theat (deg)", y="Magnitude")
gp <- gp + geom_line() + geom_point()
gp <- gp + scale_color_manual("SN",values=as.factor(df$sn)) 
print(gp)

# Add color and shape in geom_line / geom_point commands, 
gp <- ggplot(df,aes(x=t,y=y,group=sn))
gp <- gp + labs(title = "This is close, but legend symbols are wrong", x="Theat (deg)", y="Magnitude")
gp <- gp + geom_line(aes(color=as.factor(df$sn))) 
gp <- gp + geom_point(color=as.factor(df$sn),shape=as.factor(df$sn %% 6))
gp <- gp + scale_color_manual("SN",values=as.factor(df$sn)) 
print(gp)
4b9b3361

Ответ 1

Во-первых, было бы проще преобразовать sn в коэффициент.

df$sn <- factor(df$sn)

Затем вам нужно использовать scale_shape_manual, чтобы указать используемые фигуры.

gp <- ggplot(df,aes(x=t, y=y, group=sn,color=sn, shape=sn)) +
             scale_shape_manual(values=1:nlevels(df$sn)) +
             labs(title = "Demo more than 6 shapes", x="Theat (deg)", y="Magnitude") +
             geom_line() + 
             geom_point(size=3)
gp

Это должно дать вам то, что вы хотите. Вам нужно использовать scale_shape_manual, потому что даже с sn как фактор, ggplot будет содержать только до 6 различных символов автоматически. После этого вы должны указать их вручную. Вы можете изменить свои символы несколькими способами. Посмотрите эти страницы для получения дополнительной информации о том, как: http://sape.inf.usi.ch/quick-reference/ggplot2/shape
http://www.cookbook-r.com/Graphs/Shapes_and_line_types/

enter image description here

Ответ 2

Для меня ключ к сообщению об ошибке о 6 формах - это часть, в которой говорится, что Consider specifying shapes manually. ,

Если вы добавите values в scale_shape_manual, я думаю, вы получите то, что хотите. Сначала я сделал sn фактором в наборе данных.

df$sn = factor(df$sn)

ggplot(df, aes(x = t, y = y, group = sn, color = sn, shape = sn)) +
    geom_point() +
    geom_line() +
    scale_shape_manual(values = 0:10)

Я захожу на сайт Cookbook for R, когда мне нужно запомнить, какие цифры соответствуют каким формам.

Редактировать В приведенном выше примере показано добавление 11 символов, того же количества символов в вашем примере набора данных. Ваши комментарии показывают, что у вас есть намного больше уникальных значений для переменной sn чем в вашем примере. Будьте осторожны с использованием длинных серий чисел в values, так как не все числа определены как символы.

Не обращая внимания на то, стоит ли иметь в одном графике так много фигур, вы можете использовать буквы и цифры, а также символы в качестве фигур. Поэтому, если вы хотите, скажем, 73 уникальных фигуры на основе фактора с 73 уровнями, вы можете использовать 19 символов, все буквы верхнего и нижнего регистра, а также цифры 0 и 1 в качестве values.

scale_shape_manual(values = c(0:18, letters, LETTERS, "0", "1"))

Ответ 3

Вы можете получить около ста различных форм, если они вам нужны. good.shapes - это вектор чисел, которые отображаются на моем экране без аргумента заливки.

library(ggplot2)
N = 100; M = 1000
good.shapes = c(1:25,33:127)
foo = data.frame( x = rnorm(M), y = rnorm(M), s = factor( sample(1:N, M, replace = TRUE) ) )
ggplot(aes(x,y,shape=s ), data=foo ) +
    scale_shape_manual(values=good.shapes[1:N]) +
        geom_point()