R вручную установить форму по фактору
Задал этот вопрос на днях, но никто не смог визуализировать мой вопрос, поэтому я сделал пример.
A <- c('a','b', 'c','d','e')
types <- factor(A)
B <- c(1,2,3,4,5)
C <- c(6,7,8,9,10)
D <- c(1,2,1,2,3)
ABC <- data.frame(B,C,D,types)
library(ggplot2)
ggplot(ABC, aes(x=B ,y=C ,size=D, colour=as.factor(types),label=types, shape=as.factor(types))) +
geom_point()+geom_text(size=2, hjust=0,colour="black", vjust=0) +
scale_size_area(max_size=20, "D", breaks=c(100,500,1000,3000,5000)) +
scale_x_log10(lim=c(0.05,10),breaks=c(0.1,1,10))+ scale_y_continuous(lim=c(0,30000000)) +
scale_shape_manual(values=c(15,18,16,17,19))`
При составлении графика вы увидите, что есть факторы, которым приписывают цвета и формы.
В моем коде я использую scale_shape_manual, чтобы установить фигуры, и они определяются последовательностью, то есть порядок факторов a, b, c, d, e, а мои значения составляют 15,18,16,17,19, поэтому a=15 (a квадрат), б =18 и т. д.
Я хотел бы установить эти формы по фактору. Мои данные будут меняться каждый день, и факторы будут в разном порядке, но я всегда хочу, чтобы одни и те же факторы имели одинаковую форму.
Итак, очевидно, что этот код не работает, но что-то вроде:
scale_shape_manual(values=('a'=15, 'b'=18, 'c'=16, 'd'=17, 'e'=19))
Было бы полезно, если бы я мог сделать то же самое для цвета тоже.
Спасибо
1 ответ
Если я вас правильно понимаю, всегда будет (максимум) пять категорий "a" - "e", и вы хотите, чтобы формы и цвета для них были одинаковыми для всех наборов данных. Вот один из способов (примечание: gg_color_hue(...)
отсюда):
# set up shapes
shapes <- c(15,18,16,17,19)
names(shapes) <- letters[1:5]
# set up colors
gg_color_hue <- function(n) { # ggplot default colors
hues = seq(15, 375, length=n+1)
hcl(h=hues, l=65, c=100)[1:n]
}
colors <- gg_color_hue(5)
names(colors) <- names(shapes)
# original data
ggplot(ABC, aes(x=B ,y=C ,size=D, colour=types,label=types, shape=types)) +
geom_point()+geom_text(size=2, hjust=0,colour="black", vjust=0) +
scale_size_area(max_size=20, "D", breaks=c(100,500,1000,3000,5000)) +
scale_x_log10(lim=c(0.05,10),breaks=c(0.1,1,10))+
scale_y_continuous(lim=c(0,30000000)) +
scale_shape_manual(values=shapes) + scale_color_manual(values=colors)
#new data
DEF <- data.frame(B,C,D,types=factor(c("a","a","a","d","e")))
ggplot(DEF, aes(x=B ,y=C ,size=D, colour=types,label=types, shape=types)) +
geom_point()+geom_text(size=2, hjust=0,colour="black", vjust=0) +
scale_size_area(max_size=20, "D", breaks=c(100,500,1000,3000,5000)) +
scale_x_log10(lim=c(0.05,10),breaks=c(0.1,1,10))+
scale_y_continuous(lim=c(0,30000000)) +
scale_shape_manual(values=shapes) + scale_color_manual(values=colors)
Я уверен, что это больше не актуально для OP, но лучшее решение, которое я нашел для этой проблемы, проще, чем то, что сейчас опубликовано, и почти записано в самом вопросе.
Желание ОП назначить вручную определенную форму или цвет, используя что-то вроде
"scale_shape_manual(values=('a'=15, 'b'=18, 'c'=16, 'd'=17, 'e'=19))
"
требует, чтобы присвоения передавались только как вектор, как в,scale_shape_manual(values = c('a'=15, 'b'=18, 'c'=16, 'd'=17, 'e'=19))
Ответ jlhoward лучше, если вам нужны автогенерированные цвета. В то время как сценарий, который я предлагаю ниже, требует меньше строк кода. Выбор пользователей.
A <- c('a','b', 'c','d','e')
types <- factor(A)
B <- c(1,2,3,4,5)
C <- c(6,7,8,9,10)
D <- c(1,2,1,2,3)
ABC <- data.frame(B,C,D,types)
library(ggplot2)
ggplot(ABC, aes(x=B ,y=C ,size=D, colour=as.factor(types),label=types, shape=as.factor(types))) +
geom_point()+geom_text(size=2, hjust=0,colour="black", vjust=0) +
scale_size_area(max_size=20, "D", breaks=c(100,500,1000,3000,5000)) +
scale_x_log10(lim=c(0.05,10),breaks=c(0.1,1,10))+
scale_y_continuous(lim=c(0,30000000)) +
scale_shape_manual(values = c('a'=15, 'b'=18, 'c'=16, 'd'=17, 'e'=19)) +
scale_colour_manual(values = c('a'="tomato", 'b'="yellow4", 'c'="palegreen2", 'd'="deepskyblue1", 'e'="orchid3"))`