如何在热图的一个图块上显示两个分类变量 - 三角形图块

问题描述

我有一个类似于下面例子的数据集

df <- structure(list(Species = structure(c(1L,2L,3L,1L,3L),.Label = c("setosa","versicolor","virginica"),class = 
"factor"),flower_att = c("Sepal.Length","Sepal.Length","Sepal.Width","Petal.Length","Petal.Width","Petal.Width"),measurement = 
c(5.1,7,6.3,3.5,3.2,3.3,1.4,4.7,6,0.2,2.5),month = 
c("January","February","January","February")),row.names = c(NA,-12L),class = "data.frame")

我想并排显示每个物种和月份的萼片长度和宽度。我希望使用热图中的对角线分割单元来完成此操作,其中包含 2 个不同颜色的图例,即长度为红色,宽度为蓝色。如果可能,我希望该值显示在单元格段中。 到目前为止,我的搜索找到了最接近的 example,但我正在寻找可行的 ggplot 版本。

我自己的尝试目前如下所示。我不知道如何分解细胞。

ggplot(df,aes(x=month,y=Species)) +   geom_tile(aes(fill=measurement),color="black") +   theme(axis.text.x = element_text(angle=45,hjust = .5)) +   
geom_text(aes(label = round(measurement,.1))) +   scale_fill_gradient(low = 
"white",high = "red")

更新

在互联网上进行了一些认真的挖掘后,我发现了一个使用 geom_segmentgeom_text_repel 的潜在选项,见下文。谁能告诉我这是否是一个可行的选择?如果是这样,我如何才能使其满足上述要求?

我愿意将 scale_fill_gradient 切换为 scale_fill_manual 或其他替代方案,我的主要目标是让所有数据并排显示

ggplot(df,y=Species)) +
geom_tile(aes(fill=measurement),color="black") +
theme(axis.text.x = element_text(angle=45,hjust = .5)) +
geom_text_repel(aes(label = round(measurement,.1))) +
scale_fill_gradient(low = "white",high = "red")

gb <- ggplot_build(p)

p + geom_segment(data=gb$data[[1]],aes(x=xmin,xend=xmax,y=ymin,yend=ymax),color="black")

解决方法

这有点hacky,但老实说,如果不创建专用的geom,我认为你不能让它变得不那么hacky - 而且创建geom 也可能有点hacky :)

  • 使用 sapply 为每个 x/y 坐标创建三角形多边形。我想你可以在你未来的 compute_group 层中使用这种方法。
  • 搞乱因素是使订单正确的必要之恶。如果您希望在 y 轴上有一个特定的顺序,您还需要先分解 StatSplitTile
  • 使用 Species 获得多个填充比例的非常简单的方法。
  • 为更好的可比性设置相同的限制
  • coord_equal 让它看起来更好
ggnewscale

reprex package (v0.3.0) 于 2021 年 1 月 27 日创建

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...