【问题标题】:Adding square brackets to group axis labels in ggplot2在ggplot2中为组轴标签添加方括号
【发布时间】:2021-06-10 16:21:04
【问题描述】:

testmap

测试图

     Models         Group Brands  Presence Country
1    Xperia Z5      A     Sony    1        Japan
2    Galaxy S20     A     Samsung 1        Korea
3    Xperia XZ      B     Sony    1        Japan
4    Galaxy Note FE B     Samsung 0        Korea
5    Nord           A     OnePlus 1        China

我使用以下代码获得了基于国家/地区绘制的模型的存在/不存在。

ggplot(testmap, aes(x=Country, y=Models, fill=Presence))+
  geom_tile() + xlab(label="Country")+ ylab(label="Models")+
  scale_fill_gradient(low="white",high="black")+
  theme_bw() + theme(legend.position="none")

testmap.jpg

我想根据相应的品牌对模型进行分组。 (从技术上讲,画一个方括号来显示每个品牌组。)

我按照上一篇文章中的建议尝试了 facet_grid,但它也将绘图区域中的模型分组。我想将整个情节区域保持为一个。是否可以完全按照上面的方式生成图表,但只使用方括号根据品牌对它们进行分组?

尝试使用 facet_grid:

ggplot(testmap, aes(x=Country, y=Models, fill=Presence))+
  geom_tile() + xlab(label="Country")+ ylab(label="Models")+
  scale_fill_gradient(low="white",high="black")+
  facet_grid(Brands ~., scales="free", space="free_y",switch="y")+
  theme_bw() + theme(strip.placement="outside", strip.background=element_rect(fill="white"), axis.title=element_blank(),legend.position="none",strip.text.y.left = element_text(angle = 0))

【问题讨论】:

  • pBrackets 也许。一些examples on SO
  • 嗨@Henrik,您知道如何将带括号的图形打印到文件中吗? ggsave 似乎在这里不起作用。
  • 也许您可以尝试一些“标准”方法,例如here?png.

标签: r ggplot2 axis-labels


【解决方案1】:

这是一个尝试。仍在弄清楚如何正确地将文本添加到 y 轴。虽然这是非常手动且难以扩展的。

library(tidyverse)
library(grid)
library(pBrackets)

testmap <- tribble(
  ~Models, ~Group, ~Brands, ~Presence, ~Country,
  "Xperia Z5", "A", "Sony", 1, "Japan",
  "Galaxy S20", "A", "Samsung", 1, "Korea",
  "Xperia XZ", "B", "Sony", 1, "Japan",
  "Galaxy Note FE", "B", "Samsung", 0, "Korea",
  "Nord", "A", "OnePlus", 1, "China")
)
ggplot(testmap, aes(x=Country, y=Models, fill=Presence))+
  geom_tile() + xlab(label="Country")+ ylab(label="Models\n\n")+
  scale_fill_gradient(name="Presence of Models", low="white",high="black")+
  theme_bw() + theme(legend.position="none")

# using grid.locator to identify the coordinate for brackets
grid.locator(unit = "native")

# add bracket to plot area
grid.brackets(60, 134, 60, 32, type = 1)
grid.brackets(60, 233, 60, 157, type = 1)
grid.brackets(60, 353, 60, 247, type = 1)

输出:

【讨论】:

  • 感谢您的帮助!我也在 grid.locator 上进行探索!知道如何像您一样反映另一侧的支架吗?我的支架背对 y 轴标签。
  • 这取决于您指定的y1y2。如果你发现他们面对错误的一面,就会改变他们的价值。
  • 顺便说一句,您知道如何将带括号的图形打印到文件中吗? ggsave 似乎在这里不起作用。
【解决方案2】:

在 Henrik 和 Sinh Nguyen 的帮助下,我设法获得了我想要的东西 - 具体来说:方括号将 y 轴标签分组。

library(ggplot2)
library(grid)
library(pBrackets)
ggplot(testmap, aes(x=Country, y=Models, fill=Presence))+
  geom_tile() + xlab(label="Country")+ ylab(label="Models\n\n\n\n\n\n\n\n")+
  scale_fill_gradient(low="white",high="black")+
  theme_bw() + theme(legend.position="none")

grid.locator(unit="native")

grid.brackets(140, 198, 140, 78, lwd=1, ticks=NA, type = 4)
grid.brackets(140, 321, 140, 320, lwd=0.5, ticks=NA, type = 4)
grid.brackets(140, 556, 140, 436, lwd=1, ticks=NA, type = 4)

grid.text(x=unit(35,'native'), y=unit(140,'native'),
  label=expression(paste('Sony'),'type=4'), hjust = 0, vjust=0)
grid.text(x=unit(35,'native'), y=unit(325,'native'),
  label=expression(paste('OnePlus'),'type=4'), hjust = 0, vjust=0)
grid.text(x=unit(35,'native'), y=unit(496,'native'),
  label=expression(paste('Samsung'),'type=4'), hjust = 0, vjust=0)

我使用grid.locator(unit="native") 来估计位置。这是“估计的”,因为括号似乎稍微偏离预期位置。

另外,grid.brackets 中的h 可用于调整括号的水平长度。

括号和字体的类型和调整更灵活,可在手册中找到:https://cran.r-project.org/web/packages/pBrackets/pBrackets.pdf

它并不完美,但我想至少它解决了问题。 但仍然欢迎任何改进可视化的建议。

希望这个答案对遇到同样问题的人有所帮助!

谢谢!

【讨论】:

    猜你喜欢
    • 2021-08-11
    • 2021-08-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-13
    相关资源
    最近更新 更多