r - R颜色顶点igraph
问题描述
我有一个包含所有用户及其角色的数据库,我制作了一个包含 usera、role、userb 的表。我试图根据他们的团队为每个用户提供一种颜色。
下面的 SQL 代码可用于创建类似的数据集
select concat('H',ABS(Checksum(NewID()) % 999999)) acentralacc, CONCAT('Role_',CHAR( FLOOR(65 + (RAND() * 25))))role,concat('H',ABS(Checksum(NewID()) % 999999))bcentralacc
select concat('H',ABS(Checksum(NewID()) % 999999)) centralaccountname, CONCAT('Team_',CHAR( FLOOR(65 + (RAND() * 25))))team
'
#get library's
install.packages("igraph")
library("igraph")
#edges (connection between users)
connStr <- "Driver={SQL Server};MyCon;Trusted_Connection=TRUE"
dsSqlServerData <- RxSqlServerData(sqlQuery = "SELECT top 100000 * FROM MyTable1", connectionString = connStr)
data <- rxDataStep(dsSqlServerData)
head(data)
acentralacc rol bcentralacc
1 H000062 ADDN_Basis_BBE_intern H000079
2 H000062 ADDN_Basis_BBE_intern H000082
3 H000062 ADDN_Basis_BBE_intern H000092
4 H000062 ADDN_Basis_BBE_intern H000170
5 H000062 ADDN_Basis_BBE_intern H000197
6 H000062 ADDN_Basis_BBE_intern H000233
data$rol <- 1
head(data)
acentralacc rol bcentralacc
1 H000062 1 H000079
2 H000062 1 H000082
3 H000062 1 H000092
4 H000062 1 H000170
5 H000062 1 H000197
6 H000062 1 H000233
data1 <- aggregate(data[,2],data[,-2],sum)
data1 <- data1[order(data1$acentralacc,data1$bcentralacc),]
head(data1)
acentralacc bcentralacc x
1 H000062 H000062 58
9 H000062 H000067 15
17 H000062 H000071 17
25 H000062 H000073 13
33 H000062 H000077 11
41 H000062 H000079 13
#vertices (ID,node attributs)
connStr <- "Driver={SQL Server};MyCon;Trusted_Connection=TRUE"
dsSqlServerData <- RxSqlServerData(sqlQuery = "SELECT distinct CentralAccount,isnull(Team,'No Team') Team FROM MyTable2", connectionString = connStr)
users <- rxDataStep(dsSqlServerData)
head(users)
CentralAccount Team
1 H000062 ICT Customer Services
2 H000067 Financieel Beheer
3 H000070 Acceptatie Team 2 Gent
4 H000071 Acceptatie Team 1 Gent
5 H000073 NL Ond UW & Risk Advice Auto
6 H000076 Incasso
#parsing (converting) users team
users$Team <- iconv(users$Team, "ASCII", "UTF-8", sub="")
net <- graph_from_data_frame(d=data1, vertices=users, directed=T)
#the following should be igraph
class(net)
#removing graphical loops etc
net <- simplify(net, remove.multiple = F, remove.loops = T)
#creating color palet
pal2 <- rainbow(5, alpha=.5)
V(net)$color <- pal2[V(net)$Team]
plot(delete.vertices(simplify(net), degree(net)==0),vertex.size=5,vertex.label=NA,edge.arrow.size=.2)
legend("topleft", unique(c(V(net)$Team)), pch=21,col="#777777", pt.cex=2, cex=.8, bty="n", ncol=1)
这会产生一个带有白色顶点和图例的图形。
我看过这篇文章:根据 R 中另一个列表中的唯一条目生成颜色
导致以下代码
colrs<- brewer.pal(length(unique(V(net)$Team)), "Accent")
names(colrs) <- unique(V(net)$Team)
V(net)$color <- colrs[V(net)$Team]
V(net)$color
它会产生以下错误
警告消息:在 brewer.pal(length(unique(V(net)$Team)), "Accent") 中:n 太大,调色板允许的最大值 Accent 为 8 用这么多颜色返回您要求的调色板 Blockquote
我在这里找到了解决该问题的方法;https://www.r-bloggers.com/how-to-expand-color-palette-with-ggplot-and-rcolorbrewer/
这就是我做的
install.packages("RColorBrewer")
library(RColorBrewer)
colourCount = length(unique(users$Team))
getPalette = colorRampPalette(brewer.pal(9, "Set1"))
colrs<- getPalette(colourCount)
names(colrs) <- unique(V(net)$Team)
V(net)$color <- colrs[V(net)$Team]
V(net)$color
我有一个彩色(但凌乱)的图表,但我的图例没有改变颜色,我该如何解决这个问题。
添加到图例中的这行代码仅为其前面的圆圈的边框着色,并显示一个奇怪的彩色正方形。
fill=V(net)$color,col=V(net)$color
str(用户)
'data.frame': 2481 obs. of 2 variables:
$ CentralAccount: chr "H000062" "H000067" "H000070" "H000071" ...
$ Team : chr "ICT Customer Services" "Financieel Beheer" "Acceptatie Team 2 Gent" "Acceptatie Team 1 Gent" ...
解决方案
推荐阅读
- xamarin.forms - 在 xamarin.forms 中单击包含多个本地通知时,推送通知始终返回相同的 id
- python - 如何从列表中读取图像
- clips - 将规则导入 CLIPS 并评估其性能
- django - Django:测试时如何忽略函数中的部分代码
- node.js - Nodejs 10:为什么 DynamoDB 函数多次成功
- django - 根据其他字段设置新字段的值
- c++ - 计算两个给定 0 - 1 字符串的最长公共子串的长度
- apache-kafka - 为什么 Kafka 集群已经使用 Zookeeper,还需要 Controller?
- php - 如何使用 cronjob 备份 MySQL 数据库 laravel 4.2
- javascript - Typeahead JS 自动完成功能不起作用 - 找不到任何东西