基于r中的多类别对条形图进行排序

Sorting barplot based on multi-categories in r

我正在尝试按照以下顺序更正情绪得分的条形图并放入两种不同的颜色:

(消极)愤怒、厌恶、恐惧、悲伤、消极 ---(积极)期待、喜悦、惊讶、信任、积极。

下面是只给出递减图的代码。

barplot(sort(colSums(s), decreasing = TRUE),
        las = 2,
        col = rainbow(2),
        ylab = 'Count',
        main = 'User Synergies')

> dput(head(s))
structure(list(anger = c(1, 0, 0, 0, 0, 0), anticipation = c(0, 
0, 5, 0, 0, 0), disgust = c(0, 0, 0, 0, 0, 0), fear = c(1, 0, 
2, 1, 0, 0), joy = c(1, 0, 1, 0, 0, 0), sadness = c(1, 0, 2, 
1, 0, 0), surprise = c(0, 0, 2, 1, 0, 0), trust = c(4, 2, 3, 
1, 0, 1), negative = c(2, 0, 3, 2, 1, 1), positive = c(4, 4, 
7, 1, 0, 2)), row.names = c(NA, 6L), class = "data.frame")

试试这个,

df <- structure(list(anger = c(1, 0, 0, 0, 0, 0), 
                     anticipation = c(0, 0, 5, 0, 0, 0),
                     disgust = c(0, 0, 0, 0, 0, 0),
                     fear = c(1, 0,2, 1, 0, 0), 
                     joy = c(1, 0, 1, 0, 0, 0),
                     sadness = c(1, 0, 2, 1, 0, 0), 
                     surprise = c(0, 0, 2, 1, 0, 0), 
                     trust = c(4, 2, 3, 1, 0, 1),
                     negative = c(2, 0, 3, 2, 1, 1),
                     positive = c(4, 4,7, 1, 0, 2)),
                row.names = c(NA, 6L), class = "data.frame")

pn <- rainbow(2)   # "#FF0000" "#00FFFF" one for positive and the other for negative
s <- sort(colSums(df) , decreasing = TRUE)

names(s) 
#>  [1] "positive"     "trust"        "negative"     "anticipation" "fear"        
#>  [6] "sadness"      "surprise"     "joy"          "anger"        "disgust"
# arrange colors based on names of sorted columns
col <- c(pn[1] , pn[1] , pn[2] , pn[1] , pn[2] ,
         pn[2] , pn[1] , pn[1] , pn[2] , pn[2])

barplot(s ,
        las = 2,
        col = col,
        ylab = 'Count',
        main = 'User Synergies')

reprex package (v2.0.1)

创建于 2022-05-31

你可以试试

library(dplyr)
library(reshape2)
df <- data.frame(
  anger = 200,
  disgust = 100,
  fear = 900, 
  sadness = 400, 
  negative = 1500,
  anticipation = 2000,
  joy = 1200, 
  surprise = 300, 
  trust = 2500,
  positive = 5000
)

pall <- c("red", "blue")
colSums(df) %>%
  melt %>% 
  tibble::rownames_to_column(., "sentiments") %>%
  mutate(sentiments = factor(sentiments, levels = c("anger", "disgust", "fear", "sadness", "negative", "anticipation", "joy", "surprise", "trust", "positive"))) %>%
  mutate(colo = ifelse(sentiments %in% c("anger", "disgust", "fear", "sadness", "negative"), 0, 1) %>% as.factor) %>%
  barplot(data = ., value ~ sentiments, col = pall[.$colo], las = 2, xlab = "")

另一种方式:

positive <- c("anticipation", "joy", "surprise", "trust", "positive")
negative <- c("anger", "disgust", "fear", "sadness", "negative")
barplot(colSums(s[,c(negative, positive)]),
        las = 2,
        col = c(rep("red", length(negative)), rep("cyan", length(positive))),
        ylab = 'Count', ylim = c(0, 20),
        main = 'User Synergies')

结果:

另一种方法:

df <- structure(list(anger = c(1, 0, 0, 0, 0, 0), 
                     anticipation = c(0, 0, 5, 0, 0, 0),
                     disgust = c(0, 0, 0, 0, 0, 0),
                     fear = c(1, 0,2, 1, 0, 0), 
                     joy = c(1, 0, 1, 0, 0, 0),
                     sadness = c(1, 0, 2, 1, 0, 0), 
                     surprise = c(0, 0, 2, 1, 0, 0), 
                     trust = c(4, 2, 3, 1, 0, 1),
                     negative = c(2, 0, 3, 2, 1, 1),
                     positive = c(4, 4,7, 1, 0, 2)),
                row.names = c(NA, 6L), class = "data.frame")

s <- sort(colSums(df) , decreasing = TRUE)

pos <- c("positive" , "trust" , "anticipation" ,
         "surprise" , "joy")
col <- names(s)
col <- ifelse(col %in% pos , "cyan" , "red")

barplot(s ,
        las = 2,
        col = col,
        ylab = 'Count',
        main = 'User Synergies')

reprex package (v2.0.1)

创建于 2022-05-31