2017-10-18 74 views
1

我有一个数据框,其中包含40个以上的因子级别,我想为每个级别分配不同的形状。但是,如的ggplot2所示,我只能分配其中的26个,而一些!,",#等等。在scale_shape_manual中分配40个形状或更多形状

enter image description here

但我知道,在Python或JMP可以分配各种形状(如星号,左三角形,右三角形,长方形等)。是否也可以在ggplot2

data=data.frame(gr=seq(1,40), x1=runif(40), y1=runif(40)) 
library(ggplot2) 
ggplot(data=data,aes(x=x1,y=y1,shape=factor(gr),col=factor(gr)))+ 
    geom_point(alpha = 0.3,size=4,stroke=1.4) + 
    scale_shape_manual(values=c(0:40)) 

enter image description here

+5

你应该考虑使用这么多形状是否是有效的可视化。也许你的数据可以分成更少的类别?还考虑方面。 – neilfws

+0

@neilfws是的我认为,我需要尽可能多的形状:) – Alexander

+2

@亚历山大你没有考虑到足够的。人脑识别40个形状非常具有挑战性和耗时。你正在创建一个糟糕的可视化。 – Roland

回答

5

大集符号可以使用emojifont packag e与字体Awasome(见完整列表here)。更多细节给出here

library(ggplot2) 
library(emojifont) 
set.seed(1234) 
symbls <- c('fa-github', 'fa-binoculars', 'fa-twitter', 'fa-android', 'fa-coffee', 
'fa-cube', 'fa-ambulance','fa-check','fa-cutlery','fa-cogs','fa-dot-circle-o','fa-car', 
'fa-building','fa-fire', 'fa-flag','fa-female','fa-gratipay','fa-heart','fa-magnet', 
'fa-lock','fa-map','fa-puzzle-piece','fa-shopping-cart','fa-star','fa-sticky-note', 
'fa-stop-circle-o','fa-volume-down','fa-anchor', 'fa-beer','fa-book','fa-cloud', 
'fa-comment','fa-eject','fa-chrome','fa-child','fa-bomb', 'fa-certificate', 
'fa-desktop','fa-fire-extinguisher','fa-diamond') 
idx <- order(symbls) 
fa <- fontawesome(symbls) 
k <- length(fa) 
data=data.frame(gr=factor(fa, levels=fa[idx]), x1=runif(k), y1=runif(k)) 
data$gr <- factor(data$gr, levels=fa[idx]) 

ggplot(data, aes(x1, y1, colour=gr, label=gr)) + 
    xlab(NULL) + ylab(NULL) + geom_point(size=-1) + 
    geom_text(family='fontawesome-webfont', size=6, show.legend=FALSE) + 
    theme(legend.text=element_text(family='fontawesome-webfont')) + 
    scale_colour_discrete("Points",guide=guide_legend(override.aes=list(size=4))) 

enter image description here

警告:如果你想使用Rstudio代码,第一个重新分配的绘图装置如下(详情给出here):

devtools::install_github("coatless/balamuta") 
library("balamuta") 
external_graphs() 
+0

感谢您的回答。这个emjifont也有数学sybolds吗?无法找到他们?或者类似于基本符号但形状不同? – Alexander

+0

我需要一个应该在rstudio中工作的代码:) – Alexander

+0

@Alexander如果您需要使用Rstudio,请参阅我的文章更新。当Rstudio中不显示地块时,我使用此解决方案。 –

2

请问使用5种或10个不同的形状的与不同颜色足以区分的40分更好地工作的组合?我认为这些比使用/诉诸不寻常的符号更容易区分40个元素。

ggplot(data=data,aes(x=x1,y=y1, shape=factor(gr), col=factor(gr)))+ 
geom_point(alpha = 0.5, size=4, stroke=1.4) + 
scale_shape_manual(values=rep(c(0:2,5:6,9:10,11:12,14), times=4)) 

enter image description here

,或者利用该采取填充颜色的5种独特的形状。

ggplot(data=data,aes(x=x1,y=y1, shape=factor(gr), fill=factor(gr), col=factor(gr)))+ 
geom_point(alpha = 0.5, size=4, stroke=1.4) + 
scale_shape_manual(values=rep(c(21:25), times=8)) 

enter image description here

3

也许使用标签,使用ggrepel,更容易找到一些不是比较形状:

library(ggrepel) 

ggplot(data = data, aes(x = x1, y = y1, label = gr))+ 
    geom_point() + 
    geom_label_repel() 

enter image description here

+1

不错,但仍然非常混乱。如果技术上可能的话,我可能会使用交互式图形,让读者通过分配颜色来突出显示一个或两个类别。但是,当然,我怀疑映射到40个类别是重要的。我也可能会尝试汇总类别。 – Roland

+0

@Roland'shiny'在我阅读这篇文章时浮现在脑海,但我认为OP需要静态地块。是的,这需要更多的颜色分组。 – zx8754