根据第三个变量指定的色标为 ggplot xy 散点图上的每个象限着色。 geom_rectR

Coloring each quadrant on a ggplot xy scatter according to a color scale specified given by a third variable. geom_rect R

Objective:

  1. 创建变量 (xx,yy) 的 XY 散点图。根据第三个变量的 (return) 中位数为相应的笛卡尔象限着色。 我使用 colorRampPalette 创建了颜色矢量。问题是它被读取为连续的(尽管向量是离散的)。

  2. 让散点为蓝色(未标记为“蓝色”)

  3. 根据dt.data[ quadrants]在每个象限上加上一个标签,这样就很容易识别该区域对应的是什么。所以标记A或右上,B在右下等

这是我写的代码。

library(data.table)
set.seed(42)
dt <- data.table(
  xx = rnorm(40, 0, 2),
  yy = rnorm(40, 0, 2),
  return = rnorm(40, 1, 3))

## compute the range we're going to want to plot over
## in this case 50% more than the max value
RANGE <- 1.5 * dt[, max(abs(c(xx, yy)))]

## compute the medians per quadrant 
dtMedians <- dt[,
                .(med = median(return)),
                .(sign_x = sign(xx), sign_y = sign(yy))]

## set up some fake labels
dtMedians[, quadrant := letters[1:4]]

## compute a color scale for the medians and assign it
fcol <- colorRampPalette(c("#FC4445", "#3FEEE6", "#5CDB95"))
dtMedians[, col := fcol(4)[rank(med)]]
Mycol <- dt.Medians[, .(col)]

dt.rects2<- data.table(
  quadrant = letters[1:4],
  xmin= c(0,0,-RANGE, -RANGE),
  xmax= c(RANGE,RANGE,0,0),
  ymin= c(0,-RANGE,-RANGE,0),
  ymax= c(RANGE,0,0,RANGE))

dt.data <- merge(dtMedians, dt.rects2, by ="quadrant")

gg<- ggplot() + 
  geom_rect(data = dt.data, 
            aes(xmin = xmin, xmax = xmax, ymin = ymin, ymax = ymax, fill = med ))
gg+
  scale_fill_manual(values = Mycol ) +
  labs(x="xx", y="yy", title='US. Growth Quadrant') +
  geom_point(data = dt, 
             aes(x = xx,
                 y = yy,
                 color = 'blue'))

虽然我认为代码可以更简洁,但我尽可能保持不变 - 有一些错误(例如,变量 x 和 y)我必须更正才能 运行 代码。现在回答你的问题:

  1. 您可以使用 fill = as.factor(med) 告诉 R 将变量视为一个因子。此外,我必须将 scale_fill_manual(values = Mycol$col) 调整为 select df Mycol 的变量 col 中定义的颜色。

  2. 为了让散点变蓝,我在 geom_point().

    aes() 外面取了 color = 'blue'
  3. 我用了annotate()来标记绘图的角点,这依赖于手动定义x和y坐标。我确信还有其他可能更好(和自动化)的解决方案。

绘图的完整代码(获取您的数据):

ggplot() + 
  geom_rect(data = dt.data, 
            aes(xmin = xmin, xmax = xmax, ymin = ymin, ymax = ymax, fill = as.factor(med))) +
  scale_fill_manual(values = Mycol$col) +
  labs(x="xx", y="yy", title='US. Growth Quadrant') +
  geom_point(data = dt, 
             aes(x = x,
                 y = y),
                 color = 'blue') +
  annotate(geom = 'text', label = 'A', x = 5, y = 5, size = 8) +
  annotate(geom = 'text', label = 'B', x = 5, y = -5, size = 8) +
  annotate(geom = 'text', label = 'C', x = -5, y = -5, size = 8) +
  annotate(geom = 'text', label = 'D', x = -5, y = 5, size = 8)

输出: