條形圖 Part2

條形圖

Part 1

  • 簡單條形圖
  • 簇狀條形圖
  • 頻數(shù)條形圖
  • 條形圖著色
  • 正負條形圖分別著色
  • 調(diào)整寬度和條形間距

Part 2

  • 繪制堆積條形圖
  • 繪制百分比堆積條形圖
  • 添加數(shù)據(jù)標簽
  • 繪制Cleveland點圖

繪制堆積條形圖

library(gcookbook)
library(ggplot2)
ggplot(cabbage_exp, aes(x=Date, y=Weight, fill=Cultivar)) + 
    geom_bar(stat="identity")
# 有時候會遇到一個問題跟畅,就是堆積的順序和圖例的順序是相反的
# 可以使用guides()函數(shù)對圖例順序進行調(diào)整
ggplot(cabbage_exp, aes(x=Date, y=Weight, fill=Cultivar)) + 
    geom_bar(stat="identity") +
    guides(fill=guide_legend(reverse=TRUE))
# 若想要調(diào)整堆積順序,可以使用desc()函數(shù)進行調(diào)整
library(plyr)  #desc()函數(shù)調(diào)用包
ggplot(cabbage_exp, aes(x=Date, y=Weight, fill=Cultivar, order=desc(Cultivar))) + 
    geom_bar(stat="identity")

# 使用新的調(diào)色板和藍色邊框線
ggplot(cabbage_exp, aes(x=Date, y=Weight, fill=Cultivar)) + 
    geom_bar(stat="identity", colour="blue") +
    guides(fill=guide_legend(reverse=TRUE)) + 
    scale_fill_brewer(palette = "Pastell")


繪制百分比堆積條形圖

# 首先使用plyr包中的ddply()函數(shù)和transform()函數(shù)將每組條形對應的數(shù)據(jù)標準化為100%格式后叔遂,
# 再對計算結(jié)果繪制對即條形圖即可

library(gcookbook) #為了使用示例數(shù)據(jù)cabbage_exp
library(plyr)

cabbage_exp
# Cultivar Date Weight        sd  n         se
# 1      c39  d16   3.18 0.9566144 10 0.30250803
# 2      c39  d20   2.80 0.2788867 10 0.08819171
# 3      c39  d21   2.74 0.9834181 10 0.31098410
# 4      c52  d16   2.26 0.4452215 10 0.14079141
# 5      c52  d20   3.11 0.7908505 10 0.25008887
# 6      c52  d21   1.47 0.2110819 10 0.06674995

# 以Date為切割變量,對每組數(shù)據(jù)進行transform()
ce = ddply(cabbage_exp, "Date", transform,
           percent_weight=Weight/sum(Weight) * 100)

ce
# Cultivar Date Weight        sd  n         se percent_weight
# 1      c39  d16   3.18 0.9566144 10 0.30250803       58.45588
# 2      c52  d16   2.26 0.4452215 10 0.14079141       41.54412
# 3      c39  d20   2.80 0.2788867 10 0.08819171       47.37733
# 4      c52  d20   3.11 0.7908505 10 0.25008887       52.62267
# 5      c39  d21   2.74 0.9834181 10 0.31098410       65.08314
# 6      c52  d21   1.47 0.2110819 10 0.06674995       34.91686

ggplot(ce, aes(x=Date, y=percent_weight, fill=Cultivar)) + 
    geom_bar(stat = "identity")

# 計算百分比之后恼除,可以按照繪制常規(guī)對即條形圖的方法來繪制百分比堆積條形圖
# 可以自行調(diào)整圖例順序兢仰、更換調(diào)色板及添加邊框線等等

添加數(shù)據(jù)標簽

# 繪圖命令中加上geom_text()即可為條形圖添加數(shù)據(jù)標簽(其他圖也可)
# 使用時,需要指定一個變量映射給x贩挣、y和標簽本身喉前,通過設(shè)定vjust可將標簽位置移動至條形圖的上方或者下方

library(gcookbook)
# 標簽在圖形頂端上方
ggplot(cabbage_exp, aes(x=interaction(Date, Cultivar), y=Weight)) + 
    geom_bar(stat="identity") + 
    geom_text(aes(label=Weight), vjust=1.5, colour="white")
# 標簽在圖形底端上方
ggplot(cabbage_exp, aes(x=interaction(Date, Cultivar), y=Weight)) + 
    geom_bar(stat="identity") + 
    geom_text(aes(label=Weight), vjust=-0.2)


# 有時候標簽在圖形頂端上面時,可能會發(fā)生數(shù)字溢出繪圖區(qū)
# 解決這個問題可以  1>調(diào)整y軸范圍 2>調(diào)整標簽的y軸坐標
# 第二種方法的缺陷是豎直方向的調(diào)整的幅度依賴于y軸的數(shù)據(jù)范圍王财,而更
# 改vjust時卵迂,數(shù)據(jù)標簽離條形頂端的距離會根據(jù)條形圖的高度自動進行調(diào)整

# 將y軸上限變大
ggplot(cabbage_exp, aes(x=interaction(Date, Cultivar), y=Weight)) + 
    geom_bar(stat="identity") + 
    geom_text(aes(label=Weight), vjust=-0.2) +
    ylim(0, max(cabbage_exp$Weight)*1.05)
# 將y軸上限變大
ggplot(cabbage_exp, aes(x=interaction(Date, Cultivar), y=Weight)) + 
    geom_bar(stat="identity") + 
    geom_text(aes(y=Weight + 0.1), label=Weight)
# 設(shè)定標簽的y軸位置使其略高于條形圖頂端--y軸范圍會自動調(diào)整
ggplot(cabbage_exp, aes(x=interaction(Date, Cultivar), y=Weight)) + 
    geom_bar(stat="identity") + 
    geom_text(aes(y=Weight+0.1, label=Weight))
# 如果是簇狀條形圖,需要設(shè)定position_dodge()并給一個參數(shù)來設(shè)定分類
# 間距绒净,分類間距默認值是0.9见咒,標簽字體大小可使用size來調(diào)整。默認為5
ggplot(cabbage_exp, aes(x=Date, y=Weight, fill=Cultivar), y=Weight) + 
    geom_bar(stat="identity", position="dodge") + 
    geom_text(aes(label=Weight), vjust=1.5, colour="white",
              position = position_dodge(.9), size=3)
# 堆積條形圖增加數(shù)據(jù)標簽
# 在堆積條形圖添加數(shù)據(jù)標簽之前挂疆,要先對每組條形對應的數(shù)據(jù)進行累積求和改览,這
# 個過程必須保證數(shù)據(jù)的合理安排哎垦,否則可能出現(xiàn)錯誤的累積和
# 可以使用plyr包的arrange()函數(shù)完成上述操作,plyr隨ggplot2加載

library(plyr)
ce = arrange(cabbage_exp, Date, Cultivar)
# 
# Cultivar Date Weight        sd  n         se
# 1      c39  d16   3.18 0.9566144 10 0.30250803
# 2      c52  d16   2.26 0.4452215 10 0.14079141
# 3      c39  d20   2.80 0.2788867 10 0.08819171
# 4      c52  d20   3.11 0.7908505 10 0.25008887
# 5      c39  d21   2.74 0.9834181 10 0.31098410
# 6      c52  d21   1.47 0.2110819 10 0.06674995
# 
# 在數(shù)據(jù)確認安排合理后恃疯,可以借助ddply函數(shù)以Date為分組變量對
# 數(shù)據(jù)進行分組漏设,并分別計算每組數(shù)據(jù)對應的變量Weight的累積和

# 計算累積和
ce = ddply(ce, 'Date', transform, label_y=cumsum(Weight))
ce
# Cultivar Date Weight        sd  n         se label_y
# 1      c39  d16   3.18 0.9566144 10 0.30250803    3.18
# 2      c52  d16   2.26 0.4452215 10 0.14079141    5.44
# 3      c39  d20   2.80 0.2788867 10 0.08819171    2.80
# 4      c52  d20   3.11 0.7908505 10 0.25008887    5.91
# 5      c39  d21   2.74 0.9834181 10 0.31098410    2.74
# 6      c52  d21   1.47 0.2110819 10 0.06674995    4.21

ggplot(ce, aes(x=Date, y=Weight, fill=Cultivar)) + 
    geom_bar(stat = "identity") + 
    geom_text(aes(y=label_y, label=Weight), vjust=1.5, colour="White")

# 如果想把數(shù)據(jù)標簽置于條形中部

ce = arrange(cabbage_exp, Date, Cultivar)
ce = ddply(ce, "Date", transform, label_y=cumsum(Weight)-0.5*Weight)
ggplot(ce, aes(x=Date, y=Weight, fill=Cultivar)) + 
    geom_bar(stat = "identity", position = position_stack(reverse = TRUE)) +
    geom_text(aes(y=label_y, label=Weight), colour="White")
# 修改顏色樣式等
ggplot(ce, aes(x=Date, y=Weight, fill=Cultivar)) + 
    geom_bar(stat = "identity", position = position_stack(reverse = TRUE),
             colour="black") +
    geom_text(aes(y=label_y, label=paste(format(Weight, nsamll=2),"kg")), 
              size=4) + 
    guides(fill=guide_legend(reverse = TRUE)) + 
    scale_fill_brewer(palette = "Pastell")

繪制Cleveland點圖

# 使用Cleveland點圖來替代條形圖以減少圖形造成的視覺混亂并使圖形更具可讀性

library(gcookbook)
# 取出tophitters數(shù)據(jù)集中的前25個數(shù)據(jù)
tophit = tophitters2001[1:25,]
ggplot(tophit, aes(x=avg, y=name)) + geom_point()

# tophitters2001數(shù)據(jù)集包含很多列,觀察其中三列
tophit[,c("name","lg","avg")]

# name lg    avg
# 1       Larry Walker NL 0.3501
# 2      Ichiro Suzuki AL 0.3497
# 3       Jason Giambi AL 0.3423
# 4     Roberto Alomar AL 0.3357
# 5        Todd Helton NL 0.3356
# 6        Moises Alou NL 0.3314
# 7      Lance Berkman NL 0.3310
# 8         Bret Boone AL 0.3307
# 9  Frank Catalanotto AL 0.3305
# 10     Chipper Jones NL 0.3304

ggplot(tophit, aes(x=avg, y=reorder(name, avg))) +
    geom_point(size=3) + 
    theme_bw() + 
    theme(panel.grid.major.x = element_blank(),
          panel.grid.minor.x = element_blank(),
          panel.grid.major.y = element_line(colour="grey60", linetype ="dashed"))
    
# 也可以互換x和y軸今妄,x軸對應于姓名郑口,y軸對應于數(shù)值
ggplot(tophit, aes(x=reorder(name, avg), y=avg)) +
    geom_point(size=3) + 
    theme_bw() + 
    theme(axis.text.x = element_text(angle = 60, hjust = 1),
          panel.grid.major.x = element_blank(),
          panel.grid.minor.x = element_blank(),
          panel.grid.major.y = element_line(colour="grey60", linetype ="dashed"))
# 有時候根據(jù)其他變量對樣本進行分組很喲用,根據(jù)因子lg對樣本進行分組盾鳞,因子lg對應有NL
# 和AL兩個水平犬性,分別表示國家隊和美國隊,依次根據(jù)lg和avg排序腾仅,reorder參數(shù)只能對
# 一個變量對因子水平進行排序乒裆,只能手動實現(xiàn)上述過程

# 提取出name變量,依次根據(jù)變量lg和avg對其進行排序
nameorder = tophit$name[order(tophit$lg, tophit$avg)]
tophit$name = factor(tophit$name, levels = nameorder)

# 繪圖時推励,將lg變量映射到點的顏色上鹤耍,使用geom_segment()函數(shù),用“以數(shù)據(jù)點為
# 端點”代替貫通全圖的網(wǎng)格線验辞,
ggplot(tophit, aes(x=avg, y=name)) + 
    geom_segment(aes(yend=name), xend=0, colour="grey50") +
    geom_point(size=3, aes(colour=lg)) +
    scale_color_brewer(palette = "Set1", limits=c("NL", "AL")) +
    theme_bw() +
    theme(panel.grid.major.y = element_blank(),
          legend.position = c(1, 0.55),
          legend.justification = c(1, 0.5))

# 分面
ggplot(tophit, aes(x=avg, y=name)) + 
    geom_segment(aes(yend=name), xend=0, colour="grey50") +
    geom_point(size=3, aes(colour=lg)) +
    scale_color_brewer(palette = "Set1", limits=c("NL", "AL"), guide=FALSE) +
    theme_bw() +
    theme(panel.grid.major.y = element_blank())+
    facet_grid(lg ~ .,scales = "free_y", space = "free_y")

end

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末稿黄,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子跌造,更是在濱河造成了極大的恐慌杆怕,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,682評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件壳贪,死亡現(xiàn)場離奇詭異陵珍,居然都是意外死亡,警方通過查閱死者的電腦和手機违施,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,277評論 3 395
  • 文/潘曉璐 我一進店門互纯,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人醉拓,你說我怎么就攤上這事伟姐。” “怎么了亿卤?”我有些...
    開封第一講書人閱讀 165,083評論 0 355
  • 文/不壞的土叔 我叫張陵愤兵,是天一觀的道長。 經(jīng)常有香客問我排吴,道長秆乳,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,763評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮屹堰,結(jié)果婚禮上肛冶,老公的妹妹穿的比我還像新娘。我一直安慰自己扯键,他們只是感情好睦袖,可當我...
    茶點故事閱讀 67,785評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著荣刑,像睡著了一般馅笙。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上厉亏,一...
    開封第一講書人閱讀 51,624評論 1 305
  • 那天董习,我揣著相機與錄音,去河邊找鬼爱只。 笑死皿淋,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的恬试。 我是一名探鬼主播窝趣,決...
    沈念sama閱讀 40,358評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼忘渔!你這毒婦竟也來了高帖?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,261評論 0 276
  • 序言:老撾萬榮一對情侶失蹤畦粮,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后乖阵,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體宣赔,經(jīng)...
    沈念sama閱讀 45,722評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年瞪浸,在試婚紗的時候發(fā)現(xiàn)自己被綠了儒将。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,030評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡对蒲,死狀恐怖钩蚊,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情蹈矮,我是刑警寧澤砰逻,帶...
    沈念sama閱讀 35,737評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站泛鸟,受9級特大地震影響蝠咆,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,360評論 3 330
  • 文/蒙蒙 一刚操、第九天 我趴在偏房一處隱蔽的房頂上張望闸翅。 院中可真熱鬧,春花似錦菊霜、人聲如沸坚冀。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,941評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽记某。三九已至,卻和暖如春华蜒,著一層夾襖步出監(jiān)牢的瞬間辙纬,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,057評論 1 270
  • 我被黑心中介騙來泰國打工叭喜, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留贺拣,地道東北人。 一個月前我還...
    沈念sama閱讀 48,237評論 3 371
  • 正文 我出身青樓捂蕴,卻偏偏與公主長得像譬涡,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子啥辨,可洞房花燭夜當晚...
    茶點故事閱讀 44,976評論 2 355