У меня есть такие данные
dput(FCXM_AA_sp)
structure(list(Specificity_uniqueaa = structure(1:54, levels = c("A3_D161",
"A*30:01_W152", "B57_V97", "Cw5_K138", "Cw9_R91", "B13_L145",
"A*11:02_K19", "B18_G30", "A2_H74", "B63_F4", "B44_V199", "Cw16_L193",
"DR8_L74", "DQ4_D71", "A80_S31", "A80_E56", "A80_N74", "A80_K253",
"A80_K255", "Cw1_K6", "Cw1_C99", "Cw1_M248", "Cw7_L194", "Cw7_M261",
"Cw7_S273", "DR7_K14", "DR7_Q25", "DR7_L30", "DR10_E10", "DR10_R30",
"DR10_V31", "DQ2_S28", "DQ2_S30", "DQ2_I37", "DQ2_L52", "DQB1*06:01_P3",
"DQB1*06:01_L9", "DR4_H13", "DR4_H33", "DR4_Y96", "DR51_Q9",
"DR51_Q191", "DR53_A11", "DR53_C13", "DR53_L18", "DR53_W25",
"DR53_N26", "DR53_I28", "DR53_N41", "DR53_Q48", "DR53_Y81", "DR53_Q187",
"DQ5_L14", "DQ5_S125"), class = "factor"), AA = structure(c(17L,
2L, 5L, 14L, 15L, 4L, 14L, 10L, 13L, 1L, 5L, 4L, 4L, 17L, 12L,
16L, 19L, 14L, 14L, 14L, 8L, 7L, 4L, 7L, 12L, 14L, 18L, 4L, 16L,
15L, 5L, 12L, 12L, 3L, 4L, 9L, 4L, 13L, 13L, 11L, 18L, 18L, 6L,
8L, 4L, 2L, 19L, 3L, 19L, 18L, 11L, 18L, 4L, 12L), levels = c("F",
"W", "I", "L", "V", "A", "M", "C", "P", "G", "Y", "S", "H", "K",
"R", "E", "D", "Q", "N"), class = "factor"), FCXM = c("Negative",
"Negative", "Positive", "Negative", "Negative", "Negative", "Negative",
"Positive", "Positive", "Negative", "Negative", "Negative", "Negative",
"Negative", "Negative", "Negative", "Negative", "Negative", "Negative",
"Positive", "Positive", "Positive", "Negative", "Negative", "Negative",
"Positive", "Positive", "Positive", "Positive", "Positive", "Positive",
"Positive", "Positive", "Positive", "Positive", "Negative", "Negative",
"Positive", "Positive", "Positive", "Negative", "Negative", "Negative",
"Negative", "Negative", "Negative", "Negative", "Negative", "Negative",
"Negative", "Negative", "Negative", "Negative", "Negative"),
FCXM_no = c(-1L, -1L, 1L, -1L, -1L, -1L, -1L, 1L, 1L, -1L,
-1L, -1L, -1L, -1L, -1L, -1L, -1L, -1L, -1L, 1L, 1L, 1L,
-1L, -1L, -1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, -1L,
-1L, 1L, 1L, 1L, -1L, -1L, -1L, -1L, -1L, -1L, -1L, -1L,
-1L, -1L, -1L, -1L, -1L, -1L)), row.names = c(NA, -54L), class = "data.frame")
Мне нужен такой результат
Я хочу, чтобы метки были в центре блоков каждого столбца.
Я использовал код, чтобы получить желаемый результат
ggplot(FCXM_AA_sp, aes(y = FCXM_no, x = AA, fill = FCXM)) + # Fill column
geom_bar(stat = "identity", width = .6, color= "white", size=0.5) + # draw the bars
geom_text(aes(label=paste0(Specificity_uniqueaa,"")),nudge_y=10,colour = "black", size = 4, hjust = 8.4, vjust = 1) + #angle=90
scale_y_discrete() + # Labels
scale_x_discrete() + # Labels
coord_flip() + # Flip axes
labs(title = "FCXM vs AA") +
theme_tufte() + # Tufte theme from ggfortify
theme(plot.title = element_text(hjust = .5),
axis.ticks = element_blank()) + # Centre plot title
scale_fill_brewer(palette = "Dark2") # Color palette
Пожалуйста, помогите выровнять метки по центру каждого блока полос.
В отличие от geom_bar
, который по умолчанию использует position = "stack"
, geom_text
использует position = "identity"
. Следовательно, чтобы выровнять метки с полосками, вам также нужно использовать position_stack
для geom_text
и отцентрировать метки внутри этих полосок, добавив vjust=.5
, то есть использовать position = position_stack(vjust = .5)
для geom_text
(и избавиться от всех ненужных модификаций с помощью hjust=
и nudge_y=
).
Также обратите внимание, что я поменял местами x и y, чтобы избавиться от coord_flip
:
library(ggplot2)
library(ggthemes)
ggplot(FCXM_AA_sp, aes(x = FCXM_no, y = AA, fill = FCXM)) + # Fill column
geom_bar(
stat = "identity", width = .6,
color = "white", size = 0.5
) + # draw the bars
geom_text(
aes(label = Specificity_uniqueaa),
size = 8 / .pt,
position = position_stack(vjust = .5),
color = "white"
) +
labs(title = "FCXM vs AA") +
theme_tufte() + # Tufte theme from ggfortify
theme(
plot.title = element_text(hjust = .5),
axis.ticks = element_blank()
) + # Centre plot title
scale_fill_brewer(palette = "Dark2")
Быстрый способ удалить метки оси X — использовать + scale_x_continuous(breaks = NULL)
(кроме того, вы также можете удалить метки через тему, например + theme(axis.text.x = element_blank())
. Для настройки вы можете передать вектор ваших breaks=
и labels=
. Но для желаемого результата вы можете можно было бы сделать + scale_x_continuous(breaks = scales::breaks_width(1), labels = abs)
, чтобы получить разрывы на расстоянии 1, и использовать abs
для обозначения абсолютного значения.
Спасибо, Стефан, это работает. Последний вопрос. Как я могу сначала переключать положительные значения, а затем отрицательные на графике?
Привет, Стефан, спасибо за твое решение. Хочу спросить, есть ли способ редактировать метки оси х, например сначала, как это убрать? или, во-вторых, как предоставить определяемые пользователем метки оси X слева направо, например 7, 6, 5, 4, 3, 2, 1, 0, 1, 2, 3.