错误:离散值提供给连续刻度-从igraph绘制邻接矩阵时出错

时间:2018-10-28 23:46:48

标签: r ggplot2 plot igraph

我想将图的邻接矩阵绘制为棋盘格。该代码可以与使用诸如内置“ make_star”之类的功能创建的图形一起使用,但是当使用从csv文件中的邻接矩阵创建的图形时,该代码将失败。

此测试can be found here上使用的csv文件

require(igraph)
require(ggplot2)
require(reshape2)

require("igraph")


loadGraph <- function(dataPath)
{

  loadedDF <- read.csv(dataPath,
                       header=FALSE,
                       sep=',', #separate by comma
                       quote="'", # quote by '
                       stringsAsFactors = FALSE,
                       check.names = FALSE)

  #selects numeric values, drops the rest
  loadedDF <- loadedDF[sapply(loadedDF, is.numeric)]

  rownames(loadedDF) <- colnames(loadedDF)
  loadedMat <- as.matrix(loadedDF)

  #we use the rownames to index deletions
  g <- graph_from_adjacency_matrix(loadedMat) %>%
    set_vertex_attr("label", value = 1:nrow(loadedDF))


  return(g)
}

plotAdjMatrix <- function(graphToPlot){

  gAdjMatrix <- as.matrix(as_adj(graphToPlot))

  logMatrix <- (gAdjMatrix == 1)

  matData <- melt(logMatrix)

  g <- ggplot(data = matData,
              aes(Var2, Var1)) + 
    geom_tile(aes(fill = value, 
                  color = value)) + 
    coord_equal() + 
    scale_fill_manual(values = c("TRUE" = "black", "FALSE" = "white")) + 
    scale_color_manual(values = c("TRUE" = "white", "FALSE" = "black")) + 
    theme_bw() +
    theme(axis.title = element_blank(),
          axis.text = element_blank(),
          axis.ticks = element_blank(),
          panel.grid = element_blank()) +
    guides(fill = FALSE, color = FALSE) +
    scale_y_reverse()

  print(g)
}

## Test #1 
g1 <- make_star(5)

# this works
plotAdjMatrix(g1)

## Test #2
g2 <- loadGraph("./data/starGraphAdjMatrix.csv")

# this fails
plotAdjMatrix(g2)

这就是g1的样子

g1
IGRAPH b93c150 D--- 5 4 -- In-star
+ attr: name (g/c), mode (g/c), center (g/n)
+ edges from b93c150:
[1] 2->1 3->1 4->1 5->1

这是g2:

> g2
IGRAPH e338cdb DN-- 5 8 -- 
+ attr: name (v/c), label (v/n)
+ edges from e338cdb (vertex names):
[1] V1->V2 V1->V3 V1->V4 V1->V5 V2->V1 V3->V1 V4->V1 V5->V1

考虑到这一点,我想到了将“ g2”中的顶点重命名为“ 1、2、3,...”,并尝试删除该行:

 set_vertex_attr("label", value = 1:nrow(loadedDF)

无效。

1 个答案:

答案 0 :(得分:1)

有趣的是,问题出在scale_y_reverse中。从csv文件加载数据时,列名称为V1,...,V5,并且y轴上的标签也是如此。然后,显然scale_y_reverse失败了,因为它试图在将非数字值视为数字时将其反转。

解决此问题的一种方法是替换

gAdjMatrix <- as.matrix(as_adj(graphToPlot))

使用

gAdjMatrix <- unname(as.matrix(as_adj(graphToPlot)))