如何使用具有关联矩阵结构的数据框构建多个覆盖行的条形图

问题描述 投票:0回答:1

对于以下代表这五个国家按月划分的游客流量的数据,我想绘制一个多重条形图,其中多重条形图的一行代表某个国家 12 个月的游客流量,在它的顶部,下一行代表另一个国家 12 个月的游客流量,依此类推。

考虑以下数据(游客流量以百万计):

set.seed(19881003)
Australia <- (runif(12,0,1))
France <- (runif(12, 0,1) + Australia)
UnitedKingdom <- rbinom(12,2, 0.6)
USA <- rpois(12,0.06)+UnitedKingdom
Italy <- UnitedKingdom+USA+0.012
months <- c("Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov","Dec")
#
tourist.data <- data.frame(months, Australia, France, UnitedKingdom, USA, Italy)

如果您可以绘制多个条形图,以便将国家/地区绘制在 x 轴上,将月份绘制在 y 轴上,那就太好了。一行应代表特定国家 12 个月的游客流量。其顶部的另一行代表同一 12 个月另一个国家的游客流量的条形图。

如果我可以选择对国家/地区进行排序(即在底部绘制哪个国家/地区,然后在顶部绘制所选国家/地区),那就太好了。

如果有人能帮助我,我将非常感激。

可以借助 igraph 包通过确定边和顶点来绘制具有邻接矩阵的数据框的多个条形图。但我不知道如何使用具有关联矩阵结构的数据框来完成它。 谢谢

r igraph adjacency-matrix cptbarplot
1个回答
0
投票

准确地说,我可以为以下具有邻接结构的数据框提供多条形图的示例。 考虑以下数据框,它代表 5 个国家从一个国家到另一个国家的游客流量。

set.seed(19881003)
Australia <- (runif(5,0,1))
France <- (runif(5, 0,1) + Australia)
UnitedKingdom <- rbinom(5,2, 0.6)
USA <- rpois(5,0.06)+UnitedKingdom
Italy <- UnitedKingdom+USA+0.012
country <- c("Australia", "France", "UnitedKingdom", "USA", "Italy")
touristflow <- data.frame(country, Australia, France, UnitedKingdom, USA, Italy)

library(tidyr)
main_data<- pivot_longer(touristflow,cols=c("Australia", "France", "UnitedKingdom", "USA","Italy"),
                   names_to = "dest_country", values_to = "tourist_flow (in millions)")
## Also prepare a dataframe of vertices and other attributes
support_data<- data.frame(region = 
                     c("Australia",
                       "France",
                       "UnitedKingdom",
                       "USA", "Italy"),
                 order1 = c(1,2,3,4,5),
                 col1 = c("#40A4D8","#33BEB7","#B2C224",
                     "#FECC2F", "#FBA127"),
                 reg1 = c("Australia","France",
                           "UnitedKingdom",
                              "USA", "Italy"),
                 reg2 = c("","","","",""))

## prepare for chart
svg_file <- "multiplebarplot.svg"
svg(svg_file, width=10, height=12)

library(igraph)
library(RColorBrewer)
## 
## prepare data
flowdat <- graph_from_data_frame(d=main_data, vertices = support_data,
                                 directed = TRUE)
flowdat_mat <- get.adjacency(flowdat, attr = "tourist_flow (in millions)", sparse = FALSE) 
maxmvalue <- max(flowdat_mat)
n <- nrow(flowdat_mat)
m <- n
##
par(mfrow = c(n,m), omi = c(1,4,4,2), mai=c(0,0,0,0))
color1 <- rgb(255,0,210, maxColorValue = 255)
color2 <- rgb(0,208,226, maxColorValue = 255)

## chart
for (i in 1:n) {
    for (j in 1:m) {
        plot (1:1, xlim= c(0,1), ylim = c(0,1), type = "n", axes = FALSE)
        if (i<j) mycolor <- color1
        if (i==j) mycolor <- "grey80"
        if (i>j) mycolor <- color2
        if(i==1) text(0.5, 1.2,support_data$region[j],
                      cex=2, xpd=NA, adj=0, srt=45,col=color1)
        if(j==1) text(-0.1, 0.5, support_data$region[i],
                      cex=2, xpd=NA, adj=1, col=color2)
        rect(0,0,1,1, col="grey95", border=NA)
        rect(0,0,1,flowdat_mat[i,j]/maxmvalue, col=mycolor,
             border=NA)
        text(0.5,0.5,format(round(flowdat_mat[i,j],2), nsmall=2), cex=1.5,
             col="grey40")
       
    }
}
mtext("Flow to:",side=3, outer = TRUE, cex=2.5, line=14, col=mycolor1, adj=0)
mtext("Tourist Flow (in millions)", side=3, outer = TRUE, cex=3, adj=1, at=0.4, line = 22, col="grey50", family="Lato Black")

dev.off()


我还附上了输出。我需要不同国家的类似产出,但需要跨月(不是国家与国家) 希望这些信息对您有帮助

© www.soinside.com 2019 - 2024. All rights reserved.