Воспроизведение гистограммы с накоплением в R

Я безуспешно пытаюсь воспроизвести этот график в R:

введите здесь описание изображения

Но больше лет

Это данные:

title   2016 phased 2017 phased 2018 phased 2019 fully loaded
Pillar 1 minimum requirement (p1min)    4,50%   4,50%   4,50%   4,50%
Pillar 2 requirement (P2R)  4,63%   1,75%   1,75%   1,75%
Conservation Buffer 0,63%   1,25%   1,88%   2,50%
O-SII buffer    0,50%   1,00%   1,50%   1,50%
Countercyclical Buffer  0,00%   0,15%   0,25%   0,35%

В идеале, цвета будут использовать столбец «заголовок» в качестве меток (столб 1, 2 и т. д.).

Вот мой код до сих пор

library(ggplot2)
library(xlsx)
library(reshape2)
mydata <- read.xlsx("C:/Users/ken/Desktop/donnees regulation kbc.xlsx", sheetName = "Feuil4", encoding = "UTF-8", stringsAsFactors = F)

years<-c('2015 phased','2016 phased','2017 phased','2018 phased','2019 fully loaded')
df<-data.frame(years,mydata)
df<-melt(df, id.vars="years")

ggplot(df, aes(x= years, y=value, fill=variable)) +
  geom_bar(stat = "identity")

Это мой график на данный момент (полный беспорядок)

введите здесь описание изображения

dput(df)

structure(list(years = structure(c(1L, 2L, 3L, 4L, 5L, 1L, 2L, 
3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 
4L, 5L), .Label = c("2015 phased", "2016 phased", "2017 phased", 
"2018 phased", "2019 fully loaded"), class = "factor"), variable = structure(c(1L, 
1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 3L, 3L, 3L, 3L, 3L, 4L, 4L, 
4L, 4L, 4L, 5L, 5L, 5L, 5L, 5L), .Label = c("title", "X2016.phased", 
"X2017.phased", "X2018.phased", "X2019.fully.loaded"), class = "factor"), 
    value = c("Pillar 1 minimum requirement (p1min) ", "Pillar 2 requirement (P2R)", 
    "Conservation Buffer", "O-SII buffer", "Countercyclical Buffer", 
    "0.045", "0.04625", "0.00625", "0.005", "0", "0.045", "0.0175", 
    "0.0125", "0.01", "0.0015", "0.045", "0.0175", "0.01875", 
    "0.015", "0.0025", "0.045", "0.0175", "0.025", "0.015", "0.0035"
    )), row.names = c(NA, -25L), .Names = c("years", "variable", 
"value"), class = "data.frame")

person Yrden    schedule 22.02.2018    source источник
comment
Не могли бы вы использовать dput(df) и добавить результат в свой вопрос. Это может быть полезно для людей, желающих изучить ваше дело.   -  person MrSmithGoesToWashington    schedule 22.02.2018
comment
Только что сделал, спасибо, не знал об этой функции   -  person Yrden    schedule 22.02.2018
comment
Ваш df немного запутан ... в столбце значений я нахожу числовые значения и тексты ... не могли бы вы сделать это снова по совету @Foster в его ответе и обновить свой вопрос?   -  person MrSmithGoesToWashington    schedule 22.02.2018


Ответы (2)


Используя исходные данные, которые вы предоставили.

library(ggplot2)
library(reshape2)

df <- read.table(textConnection("title   '2016 phased' '2017 phased' '2018 phased' '2019 fully loaded'
                            'Pillar 1 minimum requirement (p1min)'    4,50%   4,50%   4,50%   4,50%
                            'Pillar 2 requirement (P2R)'  4,63%   1,75%   1,75%   1,75%
                            'Conservation Buffer' 0,63%   1,25%   1,88%   2,50%
                            'O-SII buffer'    0,50%   1,00%   1,50%   1,50%
                            'Countercyclical Buffer'  0,00%   0,15%   0,25%   0,35%"), header=TRUE)

данные расплава.

df<-melt(df, id.vars="title", variable.name = "year")

Замените запятые в значениях.

df$value <- gsub(",", ".", df$value)

И адаптируя приведенный здесь ответ: Отображение значений данных на гистограмме с накоплением в ggplot2

ggplot(df, aes(x = year, y = value, fill = title, label = value)) +
             geom_bar(stat = "identity") +
             geom_text(size = 3, position = position_stack(vjust = 0.5)) +
             theme(
              axis.text.y = element_blank(),
              axis.ticks.y = element_blank(),
              axis.title.y = element_blank(),
              panel.grid.major = element_blank()
                  )

Предоставляет вам это.

введите здесь описание изображения

person Wyldsoul    schedule 22.02.2018

Прочитайте данные в первом экземпляре, включая эти аргументы:

read.xlsx(..., header = T, check.names = F)

Это предотвратит включение ваших заголовков в фрейм данных длинного формата, а также остановит R, добавляющий X и . в ваши метки легенды. Надеюсь, это исправит ваши деления по оси Y, сделав все значения числовыми (в настоящее время они содержат строки, что делает их типом символов).

Если это не поможет, вы можете удалить заголовки из фрейма данных в вектор legend_labs. Вы можете использовать это, чтобы добавить пользовательские метки в легенду:

legend_labs <- c("Pillar 1", "Pillar 2"...)
ggplot(...)
+ scale_color_manual(labels = legend_labs)

Затем вы можете использовать это, чтобы пометить свои заголовки x, y и легенды:

+ labs(x = "X Title", y = "Y title", fill = "Legend Title")
person David Foster    schedule 22.02.2018