简体   繁体   English

如何从ggplot2中的汇总数据创建堆叠的条形图

[英]How to create a stacked bar chart from summarized data in ggplot2

I'm trying to create a stacked bar graph using ggplot 2. My data in its wide form, looks like this. 我正在尝试使用ggplot 2创建一个堆叠的条形图。我的数据格式很宽,看起来像这样。 The numbers in each cell are the frequency of responses. 每个单元格中的数字是响应的频率。

activity                         yes    no  dontknow
Social events                     27    3   3
Academic skills workshops         23    5   8
Summer research                   22    7   7
Research fellowship               20    6   9
Travel grants                     18    8   7
Resume preparation                17    4   12
RAs                               14    11  8
Faculty preparation               13    8   11
Job interview skills              11    9   12
Preparation of manuscripts        10    8   14
Courses in other campuses          5    11  15
Teaching fellowships               4    14  16
TAs                                3    15  15
Access to labs in other campuses   3    11  18
Interdisciplinary research         2    11  18
Interdepartamental projects        1    12  19

I melted this table using reshape2 and 我用reshape2融化了这张桌子

 melted.data(wide.data,id.vars=c("activity"),measure.vars=c("yes","no","dontknow"),variable.name="haveused",value.name="responses")

That's as far as I can get. 那是我所能得到的。 I want to create a stacked bar chart with activities on the x axis, frequency of responses in the y axis, and each bar showing the distribution of the yes, nos and dontknows 我想创建一个堆积的条形图,其中x轴上有活动,y轴上的响应频率,每个条形图显示yes,nos和dontknows的分布

I've tried 我试过了

ggplot(melted.data,aes(x=activity,y=responses))+geom_bar(aes(fill=haveused))

but I'm afraid that's not the right solution 但恐怕这不是正确的解决方案

Any help is much appreciated. 任何帮助深表感谢。

You haven't said what it is that's not right about your solution. 您尚未说出解决方案不正确的地方。 But some issues that could be construed as problems, and one possible solution for each, are: 但是一些可以解释为问题的问题,以及每个问题的一种可能的解决方案是:

  • The x axis tick mark labels run into each other. x轴刻度线标签相互贴合。 SOLUTION - rotate the tick mark labels; 解决方法-旋转刻度线标签;
  • The order in which the labels (and their corresponding bars) appear are not the same as the order in the original dataframe. 标签(及其对应的条形)的显示顺序与原始数据框中的顺序不同。 SOLUTION - reorder the levels of the factor 'activity'; 解决方案-重新排序“活动”因子的水平;
  • To position text inside the bars set the vjust parameter in position_stack to 0.5 要将文本放置在条形图内,请将vjust中的vjust参数position_stack为0.5

The following might be a start. 以下可能是一个开始。

    # Load required packages
library(ggplot2)
library(reshape2)

    # Read in data
df = read.table(text = "
activity                         yes    no  dontknow
Social.events                     27    3   3
Academic.skills.workshops         23    5   8
Summer.research                   22    7   7
Research.fellowship               20    6   9
Travel.grants                     18    8   7
Resume.preparation                17    4   12
RAs                               14    11  8
Faculty.preparation               13    8   11
Job.interview.skills              11    9   12
Preparation.of.manuscripts        10    8   14
Courses.in.other.campuses          5    11  15
Teaching.fellowships               4    14  16
TAs                                3    15  15
Access.to.labs.in.other.campuses   3    11  18
Interdisciplinay.research          2    11  18
Interdepartamental.projects        1    12  19", header = TRUE, sep = "")

    # Melt the data frame
dfm = melt(df, id.vars=c("activity"), measure.vars=c("yes","no","dontknow"),
    variable.name="haveused", value.name="responses")

    # Reorder the levels of activity
dfm$activity = factor(dfm$activity, levels = df$activity)

    # Draw the plot
ggplot(dfm, aes(x = activity, y = responses, group = haveused)) + 
geom_col(aes(fill=haveused)) +
theme(axis.text.x = element_text(angle = 90, hjust = 1, vjust = 0.25)) +
geom_text(aes(label = responses), position = position_stack(vjust = .5), size = 3)  # labels inside the bar segments

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM