Можно ли дать границу каждой группе баров в R barplot? например бары каждой страны - PullRequest
0 голосов
/ 12 апреля 2020

У меня есть несколько тысяч записей. Каждая запись имеет 12 непрерывных переменных и информацию о стране выборки и континент страны, к которой принадлежит. Я сделал барплот в R с этими 12 функциями. Теперь я хочу сгруппировать эти столбцы, поместив границу вокруг столбцов, принадлежащих каждому континенту.
Это то, что я сделал с кодом

barplot(t(as.matrix(subset(ordered, select=V1:V12))), col=rainbow(12), border=NA, names.arg=barNaming(ordered$Continent), las=2)

enter image description here Я хочу что-то похожее на это ... граница вокруг групп

enter image description here

Ниже приводится подмножество моих данных.

structure(list(V1 = c(0.99989, 1e-05, 1e-05, 1e-05, 1e-05, 1e-05, 
1e-05, 1e-05, 1e-05, 1e-05, 1e-05, 1e-05, 1e-05, 1e-05, 1e-05, 
1e-05, 1e-05, 1e-05, 1e-05, 1e-05, 1e-05, 1e-05, 1e-05, 1e-05, 
1e-05), V2 = c(1e-05, 1e-05, 1e-05, 1e-05, 1e-05, 1e-05, 1e-05, 
1e-05, 1e-05, 1e-05, 1e-05, 1e-05, 1e-05, 1e-05, 1e-05, 1e-05, 
1e-05, 1e-05, 1.6e-05, 1e-05, 1e-05, 1e-05, 0.110828, 0.122412, 
1e-05), V3 = c(1e-05, 0.99989, 0.584081, 0.971754, 0.99989, 0.099645, 
1e-05, 0.78751, 0.99989, 0.811221, 1e-05, 1e-05, 0.99989, 0.99989, 
0.99989, 0.99989, 0.665115, 1e-05, 1e-05, 1e-05, 1e-05, 1e-05, 
0.889072, 0.538943, 0.99989), V4 = c(1e-05, 1e-05, 1e-05, 1e-05, 
1e-05, 1e-05, 0.99989, 1e-05, 1e-05, 1e-05, 1e-05, 1e-05, 1e-05, 
1e-05, 1e-05, 1e-05, 1e-05, 1e-05, 1e-05, 1e-05, 1e-05, 1e-05, 
1e-05, 1e-05, 1e-05), V5 = c(1e-05, 1e-05, 1e-05, 1e-05, 1e-05, 
1e-05, 1e-05, 1e-05, 1e-05, 1e-05, 1e-05, 1e-05, 1e-05, 1e-05, 
1e-05, 1e-05, 1e-05, 1e-05, 1e-05, 1e-05, 1e-05, 1e-05, 1e-05, 
1e-05, 1e-05), V6 = c(1e-05, 1e-05, 1e-05, 1e-05, 1e-05, 1e-05, 
1e-05, 0.188371, 1e-05, 0.188679, 1e-05, 1e-05, 1e-05, 1e-05, 
1e-05, 1e-05, 1e-05, 1e-05, 1e-05, 1e-05, 1e-05, 1e-05, 1e-05, 
1e-05, 1e-05), V7 = c(1e-05, 1e-05, 1e-05, 1e-05, 1e-05, 0.705766, 
1e-05, 1e-05, 1e-05, 1e-05, 0.99989, 0.99989, 1e-05, 1e-05, 1e-05, 
1e-05, 1e-05, 1e-05, 0.977081, 0.99989, 0.99989, 0.99989, 1e-05, 
0.338555, 1e-05), V8 = c(1e-05, 1e-05, 0.415819, 0.028146, 1e-05, 
0.194499, 1e-05, 0.024029, 1e-05, 1e-05, 1e-05, 1e-05, 1e-05, 
1e-05, 1e-05, 1e-05, 0.334785, 1e-05, 0.022813, 1e-05, 1e-05, 
1e-05, 1e-05, 1e-05, 1e-05), V9 = c(1e-05, 1e-05, 1e-05, 1e-05, 
1e-05, 1e-05, 1e-05, 1e-05, 1e-05, 1e-05, 1e-05, 1e-05, 1e-05, 
1e-05, 1e-05, 1e-05, 1e-05, 0.99989, 1e-05, 1e-05, 1e-05, 1e-05, 
1e-05, 1e-05, 1e-05), V10 = c(1e-05, 1e-05, 1e-05, 1e-05, 1e-05, 
1e-05, 1e-05, 1e-05, 1e-05, 1e-05, 1e-05, 1e-05, 1e-05, 1e-05, 
1e-05, 1e-05, 1e-05, 1e-05, 1e-05, 1e-05, 1e-05, 1e-05, 1e-05, 
1e-05, 1e-05), V11 = c(1e-05, 1e-05, 1e-05, 1e-05, 1e-05, 1e-05, 
1e-05, 1e-05, 1e-05, 1e-05, 1e-05, 1e-05, 1e-05, 1e-05, 1e-05, 
1e-05, 1e-05, 1e-05, 1e-05, 1e-05, 1e-05, 1e-05, 1e-05, 1e-05, 
1e-05), V12 = c(1e-05, 1e-05, 1e-05, 1e-05, 1e-05, 1e-05, 1e-05, 
1e-05, 1e-05, 1e-05, 1e-05, 1e-05, 1e-05, 1e-05, 1e-05, 1e-05, 
1e-05, 1e-05, 1e-05, 1e-05, 1e-05, 1e-05, 1e-05, 1e-05, 1e-05
), Population = structure(c(43L, 63L, 12L, 12L, 12L, 12L, 12L, 
12L, 12L, 12L, 1L, 1L, 56L, 56L, 56L, 56L, 56L, 56L, 56L, 56L, 
56L, 56L, 12L, 12L, 12L), .Label = c("Algeria", "Australia", 
"Austria", "Beijing", "Belgium", "Brazil", "Cambodia", "Canada", 
"Chile", "China", "Chongqing", "Congo", "CzechRepublic", "Denmark", 
"England", "Finland", "Foshan", "France", "Fujian", "Georgia", 
"Germany", "Greece", "Guangdong", "Guangzhou", "Hangzhou", "Hefei", 
"HongKong", "Hungary", "Iceland", "Ireland", "Israel", "Italy", 
"Japan", "Jiangsu", "Jiangxi", "Jingzhou", "Kuwait", "Lithuania", 
"Luxembourg", "Malaysia", "Mexico", "NanChang", "NC_045512.2", 
"Nepal", "Netherlands", "NewZealand", "Nonthaburi", "Norway", 
"Pakistan", "Peru", "Poland", "Portugal", "Russia", "SaudiArabia", 
"Scotland", "Senegal", "Shandong", "Shanghai", "Shenzhen", "Sichuan", 
"Singapore", "Slovakia", "SouthAfrica", "SouthKorea", "Spain", 
"Sweden", "Switzerland", "Taiwan", "Tianmen", "USA", "Vietnam", 
"Wales", "Wuhan", "Wuhan-Hu-1", "Yunnan", "Zhejiang"), class = "factor"), 
    Continent = structure(c(2L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
    1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
    1L), .Label = c("Africa", "Asia", "Europe", "NorthAmerica", 
    "Oceania", "SouthAmerica"), class = "factor"), Country = structure(c(8L, 
    47L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 1L, 1L, 43L, 43L, 43L, 
    43L, 43L, 43L, 43L, 43L, 43L, 43L, 9L, 9L, 9L), .Label = c("Algeria", 
    "Australia", "Austria", "Belgium", "Brazil", "Canada", "Chile", 
    "China", "Congo", "CzechRepublic", "Denmark", "England", 
    "Europe", "Finland", "France", "Georgia", "Germany", "Greece", 
    "Hangzhou", "HongKong", "Hungary", "Iceland", "Ireland", 
    "Israel", "Italy", "Japan", "Kuwait", "Lithuania", "Luxembourg", 
    "Malaysia", "Mexico", "Nepal", "Netherlands", "NewZealand", 
    "Norway", "Pakistan", "Peru", "Poland", "Portugal", "Russia", 
    "SaudiArabia", "Scotland", "Senegal", "Shanghai", "Singapore", 
    "Slovakia", "SouthAfrica", "SouthKorea", "Spain", "Sweden", 
    "Switzerland", "Tailand", "Taiwan", "USA", "Vietnam"), class = "factor"), 
    col.names = structure(c(3L, 1L, 2L, 3L, 1L, 2L, 3L, 1L, 2L, 
    3L, 1L, 2L, 3L, 1L, 2L, 3L, 1L, 2L, 3L, 1L, 2L, 3L, 1L, 2L, 
    3L), .Label = c("Continent", "Country", "Population"), class = "factor")), row.names = c(NA, 
25L), class = "data.frame")

Может кто-нибудь помочь, пожалуйста

1 Ответ

2 голосов
/ 13 апреля 2020

Просто используйте аргумент space:

пробел количество пространства (в виде доли от средней ширины бара), оставшегося перед каждым баром. Может быть дано как одно число или одно число за бар

## generate numeric/country data
set.seed(1)
n <- 100
x <- rpois(n, rev(seq(n)))
x <- rbind(max(x) - x, x) / max(x)
g <- sort(sample(paste('Country', 1:5), n, replace = TRUE))


par(mfrow = 1:2)
s <- replace(rep(0, n), !duplicated(g), 0.5)
barplot(x, space = s, border = NA, col = c('darkorange', 'darkgreen'))


plot.new()
plot.window(c(1, ncol(x) + sum(s)), 0:1)
p <- par('usr')[c(1, 3, 2, 4)]
do.call('rect', c(as.list(p), col = 'black'))
barplot(x, space = s, border = NA, add = TRUE,
        col = c('darkorange', 'darkgreen'), axes = FALSE)
g <- table(g)
text(g / 2 + c(0, cumsum(g[-length(g)])), -0.15, names(g), srt = 45, xpd = NA)

enter image description here

...