Я хотел бы сделать гистограмму в 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 (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, как я хочу, но переопределяет гистограмму, оставляя пустую диаграмму:
Как я могу это сделать?
Измените метки в scale_x_continuous
:
... + scale_x_continuous(labels=c("0", "1", "2", "3", "4", "\u2265 5"))
Когда я перешел на scale_x_continuous
, я получил следующую ошибку: Erro: Discrete value supplied to continuous scale
Использование scale_x_discrete(labels=c("0", "1", "2", "3", "4", "\u2265 5"))
тоже не сработало.
@marcelo Ответ выше с scale_x_continuous
должен работать, если только ваш фактический df$Var1
не является целым/числовым. И вы уверены, что присвоили полный объект ggplot (т.е. g + geom_bar(...)
) обратно g
? Вы не сделали этого в коде, включенном в вопрос, и в этом случае было бы совершенно разумно получить пустой график.
@marcelo предполагает, что столбец Var1
является числовым/целым, как указано выше в коде вашего вопроса (я использовал ggplot2
3.1.0).
@Z.Lin Сначала я присвоил geom_bar(...)
объекту ggplot, а затем использовал scale_x_discrete
, изменение порядка присвоения устранило мою проблему, т. Е. Сначала присвоил scale_x_discrete
, а затем geom_bar(...)
. Извини, моя ошибка. Спасибо вам всем!
Один из подходов состоит в том, чтобы не изменять метки делений оси напрямую, а преобразовать ваши категориальные данные в 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) +
...
это может помочь: stackoverflow.com/questions/21646100/…