Проблемы с отображением динамических c geom_hlines в Power BI с R - PullRequest
0 голосов
/ 18 июня 2020

Я пытаюсь создать объект ggplot2 в power bi, который будет отображать любое количество горизонтальных линий в зависимости от мер, вводимых и выходящих из корзины «Значения». Я думал, что сделаю это с помощью for l oop, который добавляет к объекту дополнительную geom_hline в зависимости от длины фрейма данных. Я также хочу, чтобы каждая строка имела свой цвет, а значение hline отображалось с меткой в ​​легенде.

Используемый мной фрейм данных имеет 3 столбца stati c с заголовками - Год, Эскалация, и Тип. Любые дополнительные столбцы за пределами первых 3 будут считаться данными, которые будут использоваться для горизонтальных линий.

Это то, что у меня есть до сих пор ...

library(ggplot2)
library(RColorBrewer)

# create a unique color set
n <- 60
qual_col_pals = brewer.pal.info[brewer.pal.info$category == 'qual',]
col_vector = unlist(mapply(brewer.pal, qual_col_pals$maxcolors, rownames(qual_col_pals)))

# create an dynamic x axis label depending on the number of years to be plotted

scale <- if(length(dataset$Year) < 30) {
        scale_x_continuous(breaks = seq(min(dataset$Year), max(dataset$Year)))
} else if (length(dataset$Year) >= 30  & length(dataset$Year) <= 60) {
        scale_x_continuous(breaks = seq(min(dataset$Year), max(dataset$Year), by = 2))    
} else {
        scale_x_continuous(breaks = seq(min(dataset$Year), max(dataset$Year), by = 5))
}

#ggplot object

plot <- ggplot(dataset, aes(x = Year, y = Escalation)) +

        geom_point(aes(color = "#094780"), size = 3) +

        geom_hline(aes(yintercept = mean(dataset$Escalation), color = col_vector[1]), linetype = "dashed") +

        geom_hline(aes(yintercept = median(dataset$Escalation), color = col_vector[2]), linetype = "dashed") +

        theme(axis.text.x = element_text(colour = "#942832")) +
        theme(axis.text.y = element_text(colour = "#942832")) + 

        scale +

        scale_y_continuous(breaks = round(seq(min(dataset$Escalation), max(dataset$Escalation), by = 0.02),2))

# add horizontal comparison lines

addline <- function(data){
        c <- list(unlist(unique(dataset[3])), paste("Mean ", round(mean(dataset$Escalation), 3)), paste("Median", round(median(dataset$Escalation),3)))
        t <- list("#094780", col_vector[1], col_vector[2])
        for (i in 1:data){
                line = geom_hline(aes(yintercept = dataset[1,3+i], color = col_vector[2+i]))

                plot = plot + line

                c[3+i] = paste(unlist(names(dataset)[3+i]), " Escalation :", round(dataset[1 ,3+i], 3))
                t[3+i] = col_vector[2+i]
        }

    m = scale_color_manual(name = "", values = t, labels = c)

    plot = plot + m

    return(plot)
}

addline(NCOL(dataset)-3)

Это рендеринг, но не давая мне то, что я ожидаю, когда я добавляю данные для более чем одной горизонтальной линии (это сдвигает строку с данными, но не называет ее должным образом или не раскрашивает). Для справки, если бы было 2 горизонтальные линии и он был жестко запрограммирован, я бы хотел, чтобы код выглядел так (это правильно отображается в Power BI).

library(ggplot2)
library(RColorBrewer)

n <- 60
qual_col_pals = brewer.pal.info[brewer.pal.info$category == 'qual',]
col_vector = unlist(mapply(brewer.pal, qual_col_pals$maxcolors, rownames(qual_col_pals)))

scale <- if(length(dataset$Year) < 30) {
        scale_x_continuous(breaks = seq(min(dataset$Year), max(dataset$Year)))
} else if (length(dataset$Year) >= 30  & length(dataset$Year) <= 60) {
        scale_x_continuous(breaks = seq(min(dataset$Year), max(dataset$Year), by = 2))    
} else {
        scale_x_continuous(breaks = seq(min(dataset$Year), max(dataset$Year), by = 5))
}

plot <- ggplot(dataset, aes(x = Year, y = Escalation)) +

        geom_point(aes(color = "#094780"), size = 3) +

        geom_hline(aes(yintercept = mean(dataset$Escalation), color = col_vector[1]), linetype = "dashed") +

        geom_hline(aes(yintercept = median(dataset$Escalation), color = col_vector[2]), linetype = "dashed") +

        theme(axis.text.x = element_text(colour = "#942832")) +
        theme(axis.text.y = element_text(colour = "#942832")) + 

        scale +

        scale_y_continuous(breaks = round(seq(min(dataset$Escalation), max(dataset$Escalation), by = 0.02),2)) +

        geom_hline(aes(yintercept = dataset[1,4], color = col_vector[3]),) +

        geom_hline(aes(yintercept = dataset[1,5], color = col_vector[4]),) +

        scale_color_manual(
                name = "", 
                values = list("#094780", col_vector[1], col_vector[2], col_vector[3], col_vector[4]), 
                labels = list(unlist(unique(dataset[3])), 
                        paste("Mean ", round(mean(dataset$Escalation), 3)), 
                        paste("Median", round(median(dataset$Escalation),3)), 
                        paste(unlist(names(dataset)[4]), " Escalation :", round(dataset[1 ,4], 3)), 
                        paste(unlist(names(dataset)[5]), " Escalation :", round(dataset[1 ,5], 3))
                )
        )

plot

Я все еще новичок, когда это приходит к кодированию, поэтому я почти уверен, что я просто не понимаю чего-то, в основном, c о том, как работает l oop.

Я знаю, что это немного изменилось, но у меня трудное время для отладки, потому что мне пришлось бы экспортировать набор данных из Power BI в r studio. Любая помощь приветствуется!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...