Как я могу сделать функцию, чтобы geom_bar () в ggplot2 создавал гистограмму, которая позволяет мне проверять цвета в векторе? - PullRequest
0 голосов
/ 25 мая 2020

Я пытаюсь создать функцию, которая позволяет мне быстро проверять цвета, хранящиеся в векторе. Например, у меня есть этот вектор:

mycolors <- c("#009900", "#69ce69", "#56B4E9", "#CCCCCC", "#E69F00", "#D55E00")

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

test.palette <- function(cbPalette){
  datatest <- data.frame(
    col = cbPalette,
    x = 1:length(cbPalette),
    val = rep(1, length(cbPalette))
  )
  datatest$col <- levels(datatest$col)[datatest$col]

  print(datatest)

  myplot <- ggplot(data = datatest, mapping = aes(x = x, y = val, fill = col)) +
    geom_bar(stat="identity", width=.5) + 
    # scale_fill_manual(values = rev(datatest$col))
    scale_fill_manual(values = datatest$col)

  print(myplot)
}

mycolors <- c("#009900", "#69ce69", "#56B4E9", "#CCCCCC", "#E69F00", "#D55E00")
test.palette(cbPalette = mycolors)

Результат, который я должен sh достичь, - это иметь одну полосу для каждого цвета в моем векторе, где первая полоса имеет цвет, сохраненный как первая строка в векторных mycolors . Под каждой полосой мне нужен индекс в mycolors, который соответствует цвету этой полосы. Я также хотел бы иметь легенду с цветами полосок рядом с текстовыми строками из mycolors, соответствующими каждому цвету.

Проблема в том, что цвета полосок не отображаются в том же порядке, что и вектор и что цвета в легенде не совпадают с метками рядом с ними.

Возможно, можно было бы упростить проверку цветов в векторе, но поскольку я буду использовать ggplot2 для создания гистограмм, повторно использовать цвета из mycolors и других векторов, я был бы очень признателен за решение с использованием ggplot2 и geom_bar ().

1 Ответ

1 голос
/ 25 мая 2020

Это не работает, потому что вам нужно явно определить уровни (порядок) значений эстетики fill. В противном случае R просто сортирует их по алфавиту c.

Итак, ваш код становится:

test.palette <- function(cbPalette){
  require(ggplot2)
  datatest <- data.frame(
    col = cbPalette,
    x = 1:length(cbPalette),
    val = rep(1, length(cbPalette))
  )
  datatest$col <- levels(datatest$col)[datatest$col]

  print(datatest)

  myplot <- ggplot(data = datatest, 
                   mapping = aes(x = x, y = val, fill = factor(col, levels = col))) +
    geom_bar(stat = "identity", width = .5) + 
    scale_fill_manual(values = datatest$col, name = "My Legend")

  print(myplot)
}

mycolors <- c("#009900", "#69ce69", "#56B4E9", "#CCCCCC", "#E69F00", "#D55E00")
test.palette(cbPalette = mycolors)

enter image description here

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