R语言 为点的边界着色并根据分类变量调整形状

mgdq6dx1  于 2023-06-03  发布在  其他
关注(0)|答案(1)|浏览(215)

如何根据rank列为点的边界着色?我还想为sex分配不同的形状。

library(tidyverse)

data(Salaries, package="carData")

col <- grDevices::colorRampPalette(c("#ff816f","#f1f1f1","#004252"))(1000)

ggplot(Salaries, aes(x=yrs.since.phd, y=salary, color=rank, shape=sex) ) +
  geom_bin2d(alpha=0.5) +
  theme_bw() + 
  scale_fill_gradientn(colors=col, na.value=NA, guide="legend")

电流图:

sqougxex

sqougxex1#

这里有一种方法,可以对代码进行最小的更改。我使用stat_bin2d,这样我就可以将平铺几何体从平铺切换为点,然后将点形状更改为21,这是具有单独颜色和填充美学的形状之一。然后我可以将fillMap到..count..,它由stat_bin2d计算。
(我注意到这种方法的一个主要缺点是,许多箱子有多种性别/排名组合,你要求在同一个x/y位置显示,导致过度绘制和隐藏大部分数据。选择较少的变量一次显示。仅仅因为你可以显示5并不意味着这是一个好主意......)

ggplot(Salaries, aes(x=yrs.since.phd, y=salary, color=rank, shape=sex) ) +
  stat_bin2d(geom = "point", aes(fill = ..count..), 
             shape = 21, size = 2, stroke = 1) +
  theme_bw() + 
  scale_fill_gradientn(colors=col, na.value=NA, guide="legend") +
  scale_color_viridis_d()

我可能会采用不同的方法来更好地控制装箱和美观,通过使用dplyr预先计算计数并将其输入ggplot 2。
根本的问题是你想表现得太多了。这里要注意的是,大多数位置都有多个等级和性别的组合(最多6个),我试图在位置上使用抖动来腾出一些空间。我强烈建议一次只关注3个变量-- 5个变量在视觉上很嘈杂,几乎不可能解释。

Salaries |>
  dplyr::count(yrs.since.phd, salary_rnd = round(salary/1E4)*1E4, rank, sex) |>
ggplot(aes(yrs.since.phd, salary_rnd, colour = n, fill = rank, shape = sex)) +
  geom_point(position = position_jitter(width = 0.2, height = 1000), 
             size = 3, stroke = 1) +
  theme_bw() + 
  scale_shape_manual(values = c("Male" = 21, "Female" = 22)) +
  scale_color_gradientn(colors=col, na.value=NA, guide="legend") +
  scale_fill_viridis_d() +
  guides(fill = guide_legend(override.aes = list(shape = 21)),
         color = guide_legend(override.aes = list(shape = 21)))

相关问题