繪制R中l(wèi)ikert變量的堆積條形圖

假設(shè)我有一個如下的數(shù)據(jù)幀:

  P   Q1  Q2 ...
  1   1   4    1
  2   2   3    4
  3   1   1    4

列告訴我哪個人回答了問題q1,q2。。。相應(yīng)地。這些問題需要一個4分likert量表的答案(例如,“批準(zhǔn)”表示1,“輕微批準(zhǔn)”表示2,依此類推)。如何繪制(例如,兩個問題的結(jié)果以%為單位)堆積條形圖?

應(yīng)該是這樣的。

所有我在網(wǎng)上找到的是非常復(fù)雜的代碼,我不能處理或無法理解。。。不是只有一個簡單的函數(shù)能滿足我的需要嗎?

Thank you!

? 最佳回答:

我相信我不是唯一一個對你的這部分問題有異議的人:

所有我在網(wǎng)上找到的是非常復(fù)雜的代碼,我不能處理或無法理解。。。不是只有一個簡單的函數(shù)能滿足我的需要嗎?

“非常復(fù)雜的代碼”是相當(dāng)主觀的。然而,我可以理解,學(xué)習(xí)代碼和試圖弄清楚如何去做你想做的事情(一開始可能看起來很簡單)可能會讓人望而生畏和沮喪。我將嘗試向您展示如何以非常邏輯和清晰的方式處理此問題,以便您能夠理解這里顯示的代碼實際上并不太復(fù)雜。

The Dataset

OP沒有提供數(shù)據(jù)集,但我將在這里演示一個隨機的數(shù)據(jù)集。這也是一個展示如何通過代碼生成此類數(shù)據(jù)(并使其可擴展)的好機會。假設(shè)我們有20個人回答20個問題。我將在數(shù)據(jù)框架結(jié)構(gòu)中創(chuàng)建數(shù)據(jù),首先只提供一列人員,然后在此基礎(chǔ)上添加20列問題。問題答案的每個單元格將從1到5中隨機選擇一個答案。

library(dplyr)
library(tidyr)
library(ggplot2)

# make the dataset
set.seed(8675309)
questions <- data.frame(Person = 1:20)

for (i in 1:20) {
  questions[[paste0('Q',i)]] <- sample(1:5, 20, replace=TRUE)
}

這給了我們一個20行21列的數(shù)據(jù)框(1列表示個人+20列表示問題)。

準(zhǔn)備數(shù)據(jù)

在準(zhǔn)備生成繪圖時,幾乎總是要以某種方式準(zhǔn)備數(shù)據(jù)。在我們策劃之前,我只想先做兩件事。第一步是使我們的數(shù)據(jù)成為一種稱為整潔數(shù)據(jù)的格式。以我們現(xiàn)在的格式。。。在Excel中繪圖是可以的,但是如果我們想有一種高質(zhì)量的方法來組織和匯總這些數(shù)據(jù),我們希望以一種“更長”的表格格式來組織它。我們需要的是以一種列的方式組織:

Person | Question_num | Answer

你可以用幾種方法。在這里我使用dplyrtidyr包和gather()函數(shù),但還有其他方法(即使用pivot_longer()):

questions <- questions %>% gather(key='Question_num', value='Answer', -Person)

這里我要做的最后一件事是將列questions$Answer轉(zhuǎn)換成一個分類變量,而不是一個連續(xù)數(shù)。為什么?參與者只能回答1、2、3、4或5。回答“3.4”是沒有意義的,所以我們的數(shù)據(jù)應(yīng)該是離散的,而不是連續(xù)的。我們將把questions$Answer轉(zhuǎn)換成一個因子。這也允許我們同時做兩件非常有用的事情:

  1. 設(shè)置levels-這表示您希望因子的級別的順序。
  2. 設(shè)置labels-這允許您將1重新映射為"Approve",2"Slightly Approve",依此類推。

然后可以檢查后面的數(shù)據(jù),questions$Answer列現(xiàn)在由labels()值組成,而不是數(shù)字。

questions$Answer <- factor(questions$Answer,
    levels=1:5,
    labels=c('Approve','Slightly Approve','Neutral','Slightly Disapprove','Disapprove'))

制造情節(jié)

然后我們可以使用ggplot2包來繪制圖。GGplot使用geoms將數(shù)據(jù)繪制到繪圖區(qū)域。在本例中,我們可以使用geom_bar(),它將繪制一個條形圖(合計每個項目的數(shù)量/計數(shù)),并且只需要x美學(xué)。如果我們將每個條的fill顏色設(shè)置為等于Answer列,那么它將color-code條與每個問題的每個答案的編號相關(guān)聯(lián)。默認(rèn)情況下,這些條按我們之前為questions$Answer列的levels參數(shù)設(shè)置的順序堆疊在一起。

ggplot(questions, aes(x=Question_num)) +
  geom_bar(aes(fill=Answer))

這個地塊有很多東西是對的,總體布局看起來不錯。剩下的就是在幾個方面改變外觀。我們可以通過擴展繪圖代碼來改變繪圖的這些方面。也就是說,我想做以下幾點:

  • 添加標(biāo)題并更改一些軸標(biāo)簽
  • 將顏色方案更改為布魯爾刻度之一
  • 刪除y軸上的空白
  • 簡化主題并將圖例移到其他位置

完整的繪圖代碼如下所示。您應(yīng)該能夠識別代碼的哪些部分正在執(zhí)行上面提到的每一件事情。

ggplot(questions, aes(x=Question_num)) +
  geom_bar(aes(fill=Answer)) +
  scale_fill_brewer(palette='Spectral', direction=-1) +
  scale_y_continuous(expand=expansion(0)) +
  labs(
    title='My Likert Plot', subtitle='Twenty Questions!',
    x='Questions', y='Number Answered'
  ) +
  theme_classic() +
  theme(legend.position='top')

很酷吧?

至于“有沒有一個簡單的函數(shù)能滿足我的要求?”。答案是“不”。您可以編寫一個,但這可能取決于數(shù)據(jù)最初的格式。如果您需要經(jīng)常繪制這些繪圖,請設(shè)置一個R腳本來自動為您繪制這些繪圖:)。

主站蜘蛛池模板: 免费萌白酱国产一区二区| 国产成人AV区一区二区三| 变态拳头交视频一区二区| 精品国产日产一区二区三区 | 精品国产高清自在线一区二区三区| 好爽毛片一区二区三区四| 日本无码一区二区三区白峰美| 久久免费国产精品一区二区| 欲色影视天天一区二区三区色香欲 | 国产成人免费一区二区三区| 日韩精品无码一区二区三区免费 | 国产一区二区免费| 一区二区三区四区在线播放| 无码视频一区二区三区| 国产精品视频分类一区| 亚洲av午夜福利精品一区人妖| AV怡红院一区二区三区| 一区二区三区内射美女毛片| 国产一区二区好的精华液| 亚洲乱码一区二区三区国产精品| 一区二区三区四区精品视频| 亚洲AV无码一区东京热久久| 东京热人妻无码一区二区av| 国产亚洲欧洲Aⅴ综合一区| 一区二区三区免费视频观看| 日本中文字幕在线视频一区| 国产成人久久一区二区三区| 国产精品久久亚洲一区二区| 色婷婷亚洲一区二区三区 | 亚洲国产一区二区三区| 一区二区三区在线免费 | 红杏亚洲影院一区二区三区| 久久国产香蕉一区精品| 国产激情一区二区三区 | 亚洲一区无码精品色| 国产精品小黄鸭一区二区三区 | 中文字幕一区二区三区5566| 91秒拍国产福利一区| 国产精品一区在线播放| 亚洲熟妇成人精品一区| 精品国产一区二区二三区在线观看|