R ggplot geom_text美学长度

时间:2015-07-01 21:28:08

标签: r graphics ggplot2 labels

我正在处理一个非常大的数据集,其中包含一个虚拟变量和一个具有14个级别的因子变量 - 我发布的样本here。我正在尝试使用以下代码制作堆积比例条形图:





 .then(function (listaUsuarios){
           var argsVisit;
          console.log({ $match : { "createdAt" : { $gte: "2015-01-10T00:00:00.000Z", $lt: "2015-07-01T00:00:00.000Z"  }} },
                  { $group : { _id : { "usuario" : listaUsuarios , "dia" : { $dayOfMonth : "$createdAt" } }, "visitas" : { $sum : 1 } } });

          Visita.aggregate({ $match : { "createdAt" : { $gte: "2015-01-10T00:00:00.000Z", $lt: "2015-07-01T00:00:00.000Z"  }} },
                  { $group : { _id : { "usuario" : listaUsuarios , "dia" : { $dayOfMonth : "$createdAt" } }, "visitas" : { $sum : 1 } } })
            .exec(function (err, results) {
                    if (err) {
                        console.log("Erro!!!");
                        deferredDados.reject({
                            error: 500,
                            message: 'Erro buscando Visita, erro: '+err
                        });
                    } else {
                        if (!results || results.length == 0) {
                            console.log("Sem retorno!!!");
                            deferredDados.resolve( [0,0,0,0,0,0,0] ); //Tudo zerado poruqe não há retorno.
                            //deferredDados.resolve(0);

                            deferredDados.reject({
                                error: 500,
                                message: 'Erro buscando Visitas, não achou resultados'

                            });
                        } else {
                            console.log("Dados"+results);
                            deferredDados.resolve( results );
                            //deferredDados.resolve( results.data] );
                        }

                    }

                });
          return deferredDados.promise;       
      })



效果很好,几乎我需要的情节。我只想添加小文本标签,报告每个因子级别的观察数量。我的直觉告诉我这样的事情应该有用

ggplot(data,aes(factor(data$factor),fill=data$dummy))+
geom_bar(position="fill")+
ylab("Proportion")+
theme(axis.title.y=element_text(angle=0))

但它吐出一张空白图表和错误 Labels<-c("n=1853" , "n=392", "n=181" , "n=80", "n=69", "n=32" , "n=10", "n=6", "n=4", "n=5", "n=3", "n=3", "n=2", "n=1" ) ggplot(data,aes(factor(data$factor),fill=data$dummy))+ geom_bar(position="fill")+ geom_text(aes(label=Labels,y=.5))+ ylab("Proportion")+ theme(axis.title.y=element_text(angle=0))

这对我来说真的没有意义,因为我知道我的因子水平的长度和我肌肉发达的标签数量的长度相同。我一直想弄清楚我怎么能得到它只是打印我需要的东西而不创建像this example这样的观察数量的值向量,但无论我尝试什么,我总会得到相同的美学错误。

1 个答案:

答案 0 :(得分:3)

这个怎么样:

library(dplyr)

# Create a separate data frame of counts for the count labels
counts = data %>% group_by(factor) %>%
  summarise(n=n()) %>%
  mutate(dummy=NA)

counts$factor = factor(counts$factor, levels=0:10)

ggplot(data, aes(factor(factor), fill=factor(dummy))) +
  geom_bar(position="fill") +
  geom_text(data=counts, aes(label=n, x=factor, y=-0.03), size=4) +
  ylab("Proportion")+
  theme(axis.title.y=element_text(angle=0))

您的方法是正确的想法,但Labels需要是数据框,而不是矢量。需要使用geom_text参数为data指定数据框的名称。然后,label中的aes参数告诉geom_text哪个列用于标签。此外,即使geom_text没有使用dummy列,它也必须位于数据框中,否则您将收到错误。