Как изменить значения оси x ggplot2 в гистограмме?

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

library(ggplot2)

x <- c(1, 2, 3, 4, 5)
y <- c(4000, 3000, 2000, 1000, 500)

df <- data.frame(x, y)

names(df) <- c("Var1", "Freq")

theme_set(theme_classic())

g <- ggplot(df, aes(Var1, Freq))
g + geom_bar(stat = "identity", width = 0.5, fill = 'tomato2') + 
  xlab('Var1') +
  ylab('Freq') +
  theme(axis.text.x = element_text(angle = 0, 
                                   vjust = 0.6, 
                                   colour = "black"),
        axis.text.y = element_text(colour = "black"))

Приведенный выше код создает диаграмму, подобную этой:

Как изменить значения оси x ggplot2 в гистограмме?

Но на последнем баре я хочу, чтобы последнее значение оси x (x = 5) отображалось как >= 5.

До сих пор я пытался использовать scale_x_discrete. Поэтому я добавил к приведенному выше коду следующие строки:

n <- 5

# I'm not very creative with names.
.foo <- function(x, n) {
  if (x == n) {
    element <- paste('\u2265', toString(x), sep = ' ')
  } else {
    element <- toString(x)
  }
}

labels <- sapply(seq(n), .foo, n)

g + scale_x_discrete(breaks = sapply(seq(n), function(x) toString(x)),
                     labels = labels)

Этот код форматирует ось X, как я хочу, но переопределяет гистограмму, оставляя пустую диаграмму:

Как изменить значения оси x ggplot2 в гистограмме?

Как я могу это сделать?

это может помочь: stackoverflow.com/questions/21646100/…

user20650 07.04.2019 23:13
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
1
5 094
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Измените метки в scale_x_continuous:

... + scale_x_continuous(labels=c("0", "1", "2", "3", "4", "\u2265 5"))

plot

Когда я перешел на scale_x_continuous, я получил следующую ошибку: Erro: Discrete value supplied to continuous scale

marcelo 07.04.2019 23:33

Использование scale_x_discrete(labels=c("0", "1", "2", "3", "4", "\u2265 5")) тоже не сработало.

marcelo 08.04.2019 00:05

@marcelo Ответ выше с scale_x_continuous должен работать, если только ваш фактический df$Var1 не является целым/числовым. И вы уверены, что присвоили полный объект ggplot (т.е. g + geom_bar(...)) обратно g? Вы не сделали этого в коде, включенном в вопрос, и в этом случае было бы совершенно разумно получить пустой график.

Z.Lin 08.04.2019 08:45

@marcelo предполагает, что столбец Var1 является числовым/целым, как указано выше в коде вашего вопроса (я использовал ggplot2 3.1.0).

rcs 08.04.2019 09:18

@Z.Lin Сначала я присвоил geom_bar(...) объекту ggplot, а затем использовал scale_x_discrete, изменение порядка присвоения устранило мою проблему, т. Е. Сначала присвоил scale_x_discrete, а затем geom_bar(...). Извини, моя ошибка. Спасибо вам всем!

marcelo 08.04.2019 17:53

Один из подходов состоит в том, чтобы не изменять метки делений оси напрямую, а преобразовать ваши категориальные данные в Var1 в коэффициент, а затем изменить уровень этого фактора с помощью forcats::fct_lump, чтобы конечный фактор был ≥5

# Insert after df generated, before plot call
library(forcats)
df <- df %>% 
  mutate(Var1 = as_factor(Var1),
         Var1 = fct_lump_min(Var1, min = 501, w = Freq, other_level = "≥5"))
Ответ принят как подходящий

Проблема заключалась в том, что, как указано в комментарии @Z.Lin, я присвоил geom_bar(...) объекту ggplot перед использованием scale_x_discret. Вот решение:


library(ggplot2)
  ...
  labels <- sapply(seq(n), .foo, n)

  g <- ggplot(df, aes(Var1, Freq)) + 
         scale_x_discrete(breaks = sapply(seq(n), function(x) toString(x)),
                          labels = labels)

  g + geom_bar(stat = "identity", width = 0.5, fill = color) + 
  ...

Другие вопросы по теме