Индексы в метках галочки с дискретной переменной, сопоставленной с x
Мне было интересно, как поставить нижний индекс в метки галочки на оси X. Не в метке оси, как в большинстве других сообщений, следовательно, из значений уже во фрейме данных.
Вот воспроизводимый пример кода, я бы хотел, чтобы буквы в скобках были нижними индексами.
p_t<- c(rep("FW - P[H]",3),rep("FW - P[L]",3),rep("FW - F",3),rep("FW - SSWB",3),rep("C - F",3),rep("C - P[L]",3),rep("C - P[H]",3))
s_t<-rep(c("A","B","C"),7)
c_t <-c(0,1,2,+
0,3,2,+
0,4,3,+
0,3,4,+
0,6,5,+
0,2,4,+
0,7,2)
df_t1<-data.frame(p_t,s_t,c_t)
ggplot(data=df_t1,aes(y=c_t, x=p_t,fill = s_t))+
geom_bar(stat="identity",
color="black")
2 ответа
Возможный подход - использовать недавно выпущенный пакет ggtext, но его использование требует изменения кодировки индексов в данных примера, поскольку ggtetxt реализует поддержку Markdown и разметки HTML. В этом первом фрагменте кода я изменил данные примера, но если данные такие же, как в вопросе,gsub()
может использоваться, как показано во втором фрагменте кода, для замены квадратных скобок кодировкой HTML для индексов на лету.
library(ggplot2)
library(ggtext)
p_t <- c(rep("FW-P<sub>H</sub>", 3), rep("FW-P<sub>L</sub>", 3), rep("FW-F", 3),
rep("FW-SSWB", 3), rep("C-F", 3), rep("C-P<sub>L</sub>", 3),
rep("C-P<sub>H</sub>", 3))
s_t <- rep(c("A", "B", "C"), 7)
c_t <- c(0, 1, 2, +0, 3, 2, +0, 4, 3, +0, 3, 4, +0, 6, 5, +0, 2, 4, +0, 7, 2)
df_t1 <- data.frame(p_t, s_t, c_t)
ggplot(data = df_t1, aes(y = c_t, x = p_t, fill = s_t)) +
geom_bar(stat = "identity",
color = "black") +
theme(axis.text.x = element_markdown())
Подстановка строк может выполняться на лету в scale_x_discrete()
так что преобразование в разметку HTML при желании можно автоматизировать.
p_t <- c(rep("FW - P[H]", 3), rep("FW - P[L]", 3), rep("FW - F", 3),
rep("FW - SSWB", 3), rep("C - F", 3), rep("C - P[L]", 3),
rep("C - P[H]", 3))
s_t <- rep(c("A", "B", "C"), 7)
c_t <- c(0, 1, 2, +0, 3, 2, +0, 4, 3, +0, 3, 4, +0, 6, 5, +0, 2, 4, +0, 7, 2)
df_t1 <- data.frame(p_t, s_t, c_t)
ggplot(data = df_t1, aes(y = c_t, x = p_t, fill = s_t)) +
geom_bar(stat = "identity",
color = "black") +
scale_x_discrete(labels = function(x) {gsub("\\[", "<sub>", gsub("\\]", "</sub>", x))}) +
theme(axis.text.x = element_markdown())
Примечание: метки галочки не совсем такие же, как при использовании выражений R, поскольку символы здесь сохраняются без изменений, а интервалы между тире не добавляются и не изменяются. В этом случае тире заметно короче.
Подход, основанный на "ggplot2", заключается в том, чтобы установить метки галочки как R-выражения. (Последний фрагмент кода в этом ответе является лучшим ответом, в то время как другие фрагменты кода пытаются дать более общие ответы и представить альтернативы.)
Мы можем легко заменить значения символьных данных выражениями R, используя scale_x_discrete()
. Но, как показано здесь, это просто, только если мы используем в качестве значений данных строки, которые являются допустимыми именами R. (Столбцы на графике отображаются в алфавитном порядке в соответствии со значениями, хранящимися вp_t
, если этот порядок не изменяется с помощью breaks
параметр для scale_x_discrete
, следовательно, порядок в этом примере отличается.)
p_t <- c(rep("a", 3), rep("b", 3), rep("c", 3),
rep("d", 3), rep("e", 3), rep("f", 3),
rep("g", 3))
s_t <- rep(c("A", "B", "C"), 7)
c_t <- c(0, 1, 2, +0, 3, 2, +0, 4, 3, +0, 3, 4, +0, 6, 5, +0, 2, 4, +0, 7, 2)
df_t1 <- data.frame(p_t, s_t, c_t)
ggplot(data = df_t1, aes(y = c_t, x = p_t, fill = s_t)) +
geom_bar(stat = "identity",
color = "black") +
scale_x_discrete(labels = c(a = expression(FW - P[H]),
b = expression(FW - P[L]),
c = expression(FW - F),
d = expression(FW - SSWB),
e = expression(C - F),
f = expression(C - P[L]),
g = expression(C - P[H])))
Значения в данных переводятся с использованием именованного вектора выражений. Приведенный выше код еще не является полным ответом на вопрос, но его легче понять, чем правильный ответ, который я покажу ниже, в два этапа. Разница в том, что нам нужно использовать обратные кавычки для защиты имен при создании вектора меток, потому что значения данных содержат символы, которые требуют специальной обработки при использовании в R nanes.
p_t <- c(rep("FW - P[H]", 3), rep("FW - P[L]", 3), rep("FW - F", 3),
rep("FW - SSWB", 3), rep("C - F", 3), rep("C - P[L]", 3),
rep("C - P[H]", 3))
s_t <- rep(c("A", "B", "C"), 7)
c_t <- c(0, 1, 2, +0, 3, 2, +0, 4, 3, +0, 3, 4, +0, 6, 5, +0, 2, 4, +0, 7, 2)
df_t1 <- data.frame(p_t, s_t, c_t)
ggplot(data = df_t1, aes(y = c_t, x = p_t, fill = s_t)) +
geom_bar(stat = "identity",
color = "black") +
scale_x_discrete(labels = c(`FW - P[H]` = expression(FW - P[H]),
`FW - P[L]` = expression(FW - P[L]),
`FW - F` = expression(FW - F),
`FW - SSWB` = expression(FW - SSWB),
`C - F` = expression(C - F),
`C - P[L]` = expression(C - P[L]),
`C - P[H]` = expression(C - P[H])))
Я показываю эти более простые случаи, поскольку вопрос очень конкретный, и для большинства будущих читателей, вероятно, будет достаточно одного из более простых ответов. Этот подход можно использовать для выборочной замены отдельных меток галочки вместо всех, как показано выше.
Мы также можем автоматизировать построение вектора, переданного в качестве аргумента в labels
.
labels.vec <- parse(text = unique(df$p_t))
names(labels.vec) <- unique(df$p_t)
ggplot(data = df_t1, aes(y = c_t, x = p_t, fill = s_t)) +
geom_bar(stat = "identity",
color = "black") +
scale_x_discrete(labels = c(labels.vec))
Этот код требует только, чтобы значения в df$p_t
can be parsed into R expressions. In other words, this solution is fully driven by the values stored in the data frame.
The simplest, and recommended approach, is to do the parsing on-the-fly. Because of parameter naming and positions in the definition of parse()
we cannot directly pass parse
as argument to parameter labels
, we need to define an anonymous function as wrapper.
ggplot(data = df_t1, aes(y = c_t, x = p_t, fill = s_t)) +
geom_bar(stat = "identity",
color = "black") +
scale_x_discrete(labels = function(x) {parse(text = x)})
This final example is as simple or simpler than using 'ggtext', but does not allow adding color, etc. using embedded HTML tags, as is possible with 'ggtext'.
Note: The labels are not exactly the same as when using 'ggtext' as the "minus" character is here used for the dashes, and spacing around these dashes is adjusted for typesetting a math expression.