R按因子手动设置形状

时间:2014-10-06 14:03:50

标签: r ggplot2 shape bubble-chart

前几天问这个问题,但没有人可以想象我的问题,所以我做了一个例子。

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))`

绘制这个图表,你会发现有一些颜色和形状归因于它们的因素a-e。

在我的代码中,我使用scale_shape_manual来设置形状,它们按顺序定义,即因子的顺序是a,b,c,d,e,我的值是15,18,16,17,19所以a = 15(正方形),b = 18等等

我想按因子设置这些形状。我的数据每天都在变化,因素将以不同的顺序排列,但我总是希望相同的因素具有相同的形状。

很明显,这段代码不起作用,但是:

scale_shape_manual(values=('a'=15, 'b'=18, 'c'=16, 'd'=17, 'e'=19))

如果我也可以为颜色做同样的事情会有所帮助。

由于

2 个答案:

答案 0 :(得分:4)

如果我理解正确,那么总会有(最多)五个类别“a” - “e”,并且您希望这些类别的形状和颜色在数据集之间保持一致。这是一种方式(注意:gg_color_hue(...)来自here):

# 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)

答案 1 :(得分:2)

我确定这与OP不再相关,但是我发现的针对该问题的最佳解决方案比当前发布的解决方案更简单,并且几乎已写入问题本身。

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"))`