ggplot2 - x轴刻度文本中的上标

3

我正在尝试让x轴上两个变量的文本具有上标。我希望“+”成为上标,但无论我尝试什么,它都只会显示整个代码。我已经尝试过为其创建单独的标签,也试图保持更简单。

test.labs=as_labeller(c('CD4Gated' = 'CD4^+ cells', 'CD8Gated' = 'CD8^+ cells', 'Bcell' 
= "B cells"), default = label_parsed)

bFICOLL + scale_x_discrete(labels=c(CD4Gated = "CD4^+ cells", CD8Gated = "CD8^+ cells", 
Bcell = "B cells"))

在另一张图表中(经过长时间的搜索!),我成功地通过下面的代码使标题包含上标,但它不能用于刻度标签。

ggtitle('Spring FEC &' ~~ CD4^'+' ~~ 'cells')

这是图形的代码。希望有人能告诉我哪里出了问题?
  bFICOLL <-  ggplot(LymphOrder, aes(x=WBC, y=Percentage, fill=Diagnosis, 
  shape=Diagnosis)) + 
  geom_violin() +
  facet_wrap(~Season, scale="free")+
  theme(strip.text.x = element_text(size = 30))+
  geom_point(pch = 21, position = position_jitterdodge())+
  scale_fill_manual(values=c("#56B4E9", "#009E73"))+ 
  scale_shape_manual(values=c(1,2))+
  theme(panel.background = element_blank(), axis.line = element_line(colour = "black"))+
  theme(strip.background = element_rect( color="black", fill="#FFFFFF", size=1.5, 
  linetype="solid"))+
  ggtitle('Lymphocyte subsets')+
  theme(plot.title = element_text(size = 40, face = "bold")) +
  ylab('Percentage') +
  xlab("Lymphocytes")+
  ylim(0,80)+
  theme(axis.ticks.length = unit(5, "pt"))+
  theme(axis.title.x = element_text(size=20))+
  theme(axis.text.x = element_text(size=15))+
  theme(axis.text.x = element_text(angle = 30, hjust = 1))+
  theme(axis.text.y = element_text(size=20))+
  theme(axis.title.y = element_text(size=20))+
  theme(legend.title = element_blank(),
    legend.text = element_text(size = 20))
  bFICOLL + scale_x_discrete(labels=c(CD4Gated = "CD4^+ cells", CD8Gated = "CD8^+ 
  cells", 
  Bcell = "B cells"))

在x轴刻度标签中不带上角标的箱线图


与 ggplot 轴标签中的下标字母相关。 - tjebo
你能否“请”创建一个简单得多的例子?这个问题非常有趣,但你使用的代码太过复杂,而且甚至无法重现。比如可以使用简单的绘图,例如 ggplot(iris, aes(Species, Sepal.Length)) + geom_boxplot() - tjebo
2个回答

3
使用ggtext包:
library(ggplot2)
library(ggtext)

my_labs <- c(setosa = "CD4^+ cells", versicolor = "CD8^+ 
  cells", virginica = "B cells")

ggplot(iris, aes(Species, Sepal.Length)) + 
  geom_boxplot() +
  scale_x_discrete(labels = my_labs) +
  theme(axis.text.x = element_markdown())

reprex包(v2.0.1)于2022年6月14日创建


抱歉代码有点长,我会记住这一点,以备将来有任何问题!感谢您的帮助。使用更简单的图表,您的代码可以正常工作。我已经加载了ggtext并认为它不是我需要的。现在我会逐行查看原始图表代码,找出它不喜欢什么。再次感谢,我已经为此工作了很长时间! - Len
@len 这是解决问题的一个基本原则:将问题缩小到最小范围。尝试用最小的例子重现问题有助于看清问题的真正所在和可能的解决方案。这可以揭示出增加复杂性而不是实际基本解决方案中存在的问题。这也是我们鼓励人们创建最小化示例的另一个原因 - 它需要思考和分析过程,有助于你自己找到解决方案。 - tjebo

0
你可以使用bquote手动定义一个带有上标的命名标签向量,然后使用scale_x_discrete(labels = ...)让这些标签显示在正确的刻度上。
library(ggplot2)
library(tidyr)
library(dplyr)

# this is just a sample using mtcars data
trial <- mtcars %>%
  mutate(car = rownames(.)) %>%
  pivot_longer(mpg:carb)

first_3 <- trial %>% filter(name == "mpg") %>% head(3)
car_names <- first_3$car
# manually create a vector of 3 labels with superscript
super_labels <- c(bquote(AMC~Javelin^super), bquote(Cadillac~another^super),
                  bquote(Camaro~third^super))
super_labels
#> [[1]]
#> AMC ~ Javelin^super
#> 
#> [[2]]
#> Cadillac ~ another^super
#> 
#> [[3]]
#> Camaro ~ third^super

# assign names to the labels vector which will be used by ggplot
names(super_labels) <- car_names[1:3]
super_labels
#> $`Mazda RX4`
#> AMC ~ Javelin^super
#> 
#> $`Mazda RX4 Wag`
#> Cadillac ~ another^super
#> 
#> $`Datsun 710`
#> Camaro ~ third^super

# plot without using the scale_x_discrete - superscript labels
ggplot(data = first_3) +
  geom_point(aes(x = car, y= value)) +
  theme(axis.text.x = element_text(angle = 30, hjust = 1))

# plot using the scale_x_discrete - superscript labels
ggplot(data = first_3) +
  geom_point(aes(x = car, y= value)) +
  theme(axis.text.x = element_text(angle = 30, hjust = 1)) +
  scale_x_discrete(labels = super_labels)

reprex package (v2.0.1)于2022年6月14日创建


你可以展示一个在标签中间的上标符号“+”的例子吗?我猜这很重要,因为它会稍微改变表达式。 - tjebo
感谢您在此方面花费的时间。您关于中间上标的观点是正确的,它会改变事情。我尝试只使用上标中的 '+',但也得到了单元格。这是您修改为我想要的文本的代码。super_labels <- c(bquote('B细胞'), bquote(CD4^+ 细胞), bquote(CD8^+ 细胞)) super_labels如果您有时间查看此问题,我应该能够处理这些答案。我只是好奇如何使您的代码工作。 - Len

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接