【R画图学习9.6】堆积柱状图

今天我们学习另外一种柱状图,堆积柱状图,就是把每一个组的量堆积起来画成一个柱状图。

用自带的一个测试数据。

library(reshape2)

library(ggplot2)

data = datasets::attitude

head(data)


从测试数据来看,是一个包含30个样本,7个变量的数据。下面我们查看每个样本的scale是否一样。先查看一下总和,我们利用apply函数。

apply函数:对矩阵、数据框、数组(二维、多维)等矩阵型数据,按行或列应用函数FUN进行循环计算,并以返回计算结果

apply(X, MARGIN, FUN, ...)

X:数组、矩阵、数据框等矩阵型数据

MARGIN: 按行计算或按按列计算,1表示按行,2表示按列

FUN: 自定义的调用函数


statistics = apply(data, 1, sum)

statistics

plot(statistics)


从图中可以看出每个样本的sum是不一样的,如果要画堆积图的话,就不一样的比例了。所以我们转化成百分比来画。

df = data.frame()

for (n in 1:nrow(data))

{

  df = rbind(df, data[n,]/statistics[n]) 

}

statistics = apply(df, 1, sum)

statistics

plot(statistics)

可以看出,转化成百分比之后,每个样本中的scale是一样的,都是1。

df$name =paste("c",seq(1,nrow(df),1),sep="")

我们再手动的添加了名字上去,方面后面做演示。

#作图前有个很重要的前置动作,要把宽矩阵转换为长矩阵。通过melt函数来实现。melt(短数据名称,id="不做变换的列名",variable=“自定义”value=“自定义”)。其中variable和value的值可自定义,默认值为variable和value。

data_plot = melt(df,id = "name")

从data_plot可以看出,变成了短数据,主要是把每一列都转化成了行的形式。

group = c(rep("g1",6),rep("g2",6),rep("g3",6),rep("g4",6),rep("g5",6))

group2 =rep(group,ncol(data))

level=paste("c",seq(1,nrow(df),1),sep="")

data_plot$group=group2   #我们又手动的添加了分组的标签,方面后面操作

data_plot$name=factor(data_plot$name,levels=level)   #为了让按照我们想要的顺序排序,我们把name设置成了因子

ggplot( data_plot, aes( x = name, weight = value, fill = variable))+

geom_bar( position = "stack")

下面就生成了一个基本的堆积图。

如果把"stack"改成"dodge",可以变成分组柱状图。

ggplot( data_plot, aes( x = name, weight = value, fill = variable))+

  geom_bar( position = "dodge")

可以手动的改颜色等,当然values里面也可以自定义颜色。

ggplot( data_plot, aes( x = name, weight = value, fill = variable))+

geom_bar( position = "stack")+

scale_fill_manual( values = rainbow(7))

也可以根据我们设置的group来分面板来画。

ggplot( data_plot, aes( x = name, weight = value, fill = variable))+

geom_bar( position = "stack",width=0.9)+

scale_fill_manual( values = rainbow(7))+

xlab("people")+

ylab("percent")+

theme_classic()+

theme(text = element_text(size = 15))+

theme(axis.text = element_text(face = "bold"),

        axis.text.x = element_text(angle = 45, hjust = 1))+

facet_wrap(group~.,scales="free_x",nrow = 1)+

theme(strip.background=element_rect(fill = c("blue")))

比如,如果我们想按照variable占的比例来排序,一般情况下,最多的在最下面,就需要指定variable为factor了。

order_x =  apply(df[,1:7], 2, sum)  # 查看各列 variable的总和

order_x = order_x[order(order_x, decreasing = F)]  # decreasing = T 代表是倒序

order_x  # 看一下,是从大到小排着的

# 此时 data_plot数据框里面的 variable就按照给定的 levels 排序了

data_plot$variable= factor(data_plot$variable,

                          levels = names(order_x) , 

                          ordered = T )

ggplot( data_plot, aes( x = name, weight = value, fill = variable))+

geom_bar( position = "stack",width=0.9)+

scale_fill_manual( values = rainbow(7))+

xlab("people")+

ylab("percent")+

theme_classic()+

theme(text = element_text(size = 15))+

theme(axis.text = element_text(face = "bold"),

        axis.text.x = element_text(angle = 45, hjust = 1))+

facet_wrap(group~.,scales="free_x",nrow = 1)+

theme(strip.background=element_rect(fill = c("blue")))

柱状图里面书序就改成我们想要的顺序了。

其实用我们前面用的boxplot来查看比例更为清晰一点。

ggplot(data_plot, aes( x = variable, y= value, fill = variable))+

geom_boxplot()

library(RColorBrewer)

a <- brewer.pal(7,"Set1")

a <- terrain.colors(7)

a <- heat.colors(7)

a <- topo.colors(7)

ggplot( data_plot, aes( x = name, weight = value, fill = variable))+

geom_bar( position = "stack",width=0.9)+

scale_fill_manual( values = rainbow(7))+

#scale_fill_manual( values = a)+

xlab("people")+

ylab("percent")+

theme_classic()+

theme(text = element_text(size = 15))+

theme(axis.text = element_text(face = "bold"),

        axis.text.x = element_text(angle = 45, hjust = 1))+

facet_wrap(group~.,scales="free_x",nrow = 1)+

theme(strip.background=element_rect(fill = c("gray")))+

scale_y_continuous(expand = c(0,0))   #消除Y轴两端的留白区域

我们进行了微调格式以下,比如可以更换不同的色系等。


©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,454评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,553评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,921评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,648评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,770评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,950评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,090评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,817评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,275评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,592评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,724评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,409评论 4 333
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,052评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,815评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,043评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,503评论 2 361
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,627评论 2 350

推荐阅读更多精彩内容