堆叠的条形图,每个堆叠的独立填充顺序

时间:2018-12-03 14:54:41

标签: r ggplot2

我正面临BlogPlugin的行为,我无法理解的排序和堆积条形图。
我已经读过一些有关它的问题(herehere和等等),但不幸的是我找不到适合我的解决方案。也许答案很简单,但我看不到。希望不是骗子。

我的主要目标是根据排序列(在此称为ggplot2)对每个堆栈进行独立排序。

这里有一些数据:

ordering

因此,有一个ID,一个值,一个用于排序的值和一个填充,数据就像在library(dplyr) library(ggplot2) dats <- data.frame(id = c(1,1,1,2,2,3,3,3,3), value = c(9,6,4,5,6,4,3,4,5), ordering = c(1,2,3,2,3,1,3,2,4), filling = c('a','b','c','b','a','a','c','d','b')) %>% arrange(id,ordering) 列中一样应该在图中进行排序。

我试图绘制它:想法是将ordering(值id,由value填充为x轴堆叠的条形图,但填充按顺序排列filling的值,按升序 ie ordering 每列底部的最大值ordering的顺序与数据集的顺序相同,即每一列都有独立的顺序。

您可以想象它们是假数据,因此id的数量可以变化。

filling

当我绘制它们时,有一些我不理解的东西:

 id value ordering filling
1  1     9        1       a
2  1     6        2       b
3  1     4        3       c
4  2     5        2       b
5  2     6        3       a
6  3     4        1       a
7  3     4        2       d
8  3     3        3       c
9  3     5        4       b

enter image description here

第二个和第三个ID的顺序不正确,我应该具有原始数据集的顺序。

3 个答案:

答案 0 :(得分:6)

如果您使用单独的var IpAddress = Dns.GetHostAddresses(Dns.GetHostName()).FirstOrDefault(); if (IpAddress != null) { return IpAddress.ToString(); } ,则可以使订单不同。

geom_bar

enter image description here

更一般地:

dats %>% 
  ggplot(aes(x = id, y = value, fill = reorder(filling,-ordering))) + 
    geom_bar(stat = "identity", position = "stack", data = dats %>% filter(id == 1)) +
    geom_bar(stat = "identity", position = "stack", data = dats %>% filter(id == 2)) +
    geom_bar(stat = "identity", position = "stack", data = dats %>% filter(id == 3)) +
    guides(fill=guide_legend("ordering")) 

答案 1 :(得分:5)

问题在于,根据您的情况,不同的条形应该以不同的顺序使用filling的相同值(级别)。这与ggplot的工作方式相冲突:采用因子水平(已经具有一定顺序)并以相同的方式将其应用于每个柱。

一种解决方法是...创建许多因子水平。

ggplot(dats, aes(x = id, y = value, fill = interaction(-ordering, id))) + 
  geom_bar(stat = "identity", position = "stack")

enter image description here

由于过于详细,现在该“过于慷慨”。但是,我们现在要做的就是处理图例和不同的颜色:

dats <- arrange(dats, id, -ordering)
aux <- with(dats, match(sort(unique(filling)), filling))
ggplot(dats, aes(x = id, y = value, fill = interaction(-ordering, id))) + 
  geom_bar(stat = "identity", position = "stack") +
  scale_fill_manual("Ordering", values = scales::hue_pal()(4)[dats$filling],
                    labels = with(dats, filling[aux]), 
                    breaks = with(dats, interaction(-ordering, id)[aux]))

enter image description here

在这里,我首先重新排列dats的行,以避免以后再执行此操作。那么aux是辅助向量

aux
# [1] 3 2 1 8

给出abcd(按顺序)出现在dats中的任意位置(每个位置一个),稍后再次有用。然后,我只需设置相应的比例值,标签和折线...最后,我使用scales::hue_pal恢复原始调色板。

答案 2 :(得分:-1)

这里的问题是元素filling = d仅在第三组中以较低的值出现。一种解决方案是用0填充不存在的值:

library(dplyr)
#> 
#> Attachement du package : 'dplyr'
#> The following objects are masked from 'package:stats':
#> 
#>     filter, lag
#> The following objects are masked from 'package:base':
#> 
#>     intersect, setdiff, setequal, union
library(ggplot2)
dats <- data.frame(id = c(1,1,1,1,2,2,2,2,3,3,3,3),
                   value = c(9,6,4,0,5,6,0,0,4,3,4,5),
                   ordering = c(1,2,3,5,2,3,5,5,1,3,2,4),
                   filling = c('a','b','c','d','b','a','c','d','a','c','d','b')) %>% arrange(id,ordering)


ggplot(dats,aes(x = id,
                y = value,
                fill = reorder(filling,-ordering))) + 
  geom_bar(stat = "identity",position = "stack") +
  guides(fill=guide_legend("ordering")) 

reprex package(v0.2.1)于2018-12-03创建