根据data.frame列值R指定点颜色

gan*_*oid 10 r ggplot2

这是关于SO的第一个问题,我希望有人可以帮我解答.

我正在用csv读取数据R,data<-read.csv("/data.csv")并得到类似的东西:

Group    x   y  size    Color
Medium   1   2  2000    yellow
Small   -1   2  1000    red
Large    2  -1  4000    green
Other   -1  -1  2500    blue
Run Code Online (Sandbox Code Playgroud)

每个组颜色可能会有所不同,它们在csv生成文件时由公式指定,但这些颜色都是可能的颜色(组的数量也可能不同).

我一直试图这样使用ggplot():

data<-read.csv("data.csv")
xlim<-max(c(abs(min(data$x)),abs(max(data$x))))
ylim<-max(c(abs(min(data$y)),abs(max(data$y))))
data$Color<-as.character(data$Color)
print(data)
ggplot(data, aes(x = x, y = y, label = Group)) +
geom_point(aes(size = size, colour = Group), show.legend = TRUE) +
scale_color_manual(values=c(data$Color)) +
geom_text(size = 4) +
scale_size(range = c(5,15)) +
scale_x_continuous(name="x", limits=c(xlim*-1-1,xlim+1))+
scale_y_continuous(name="y", limits=c(ylim*-1-1,ylim+1))+
theme_bw()
Run Code Online (Sandbox Code Playgroud)

除了颜色,一切都是正确的

  • 小被画成蓝色
  • 介质为红色
  • 其他是绿色的
  • 大被绘制成黄色

我注意到右侧的图例按字母顺序排列组(大,中,其他,小),但颜色保留在csv文件顺序中.

这是情节的截图.

在此输入图像描述

谁能告诉我我的代码中缺少什么来解决这个问题?其他获得相同结果的方法也是受欢迎的.

sco*_*coa 15

执行此操作的一种方法help("scale_colour_manual")是使用命名字符向量:

col <- as.character(data$Color)
names(col) <- as.character(data$Group)
Run Code Online (Sandbox Code Playgroud)

然后values将比例的参数映射到此向量

# just showing the relevant line
scale_color_manual(values=col) +
Run Code Online (Sandbox Code Playgroud)

完整代码

xlim<-max(c(abs(min(data$x)),abs(max(data$x))))
ylim<-max(c(abs(min(data$y)),abs(max(data$y))))

col <- as.character(data$Color)
names(col) <- as.character(data$Group)

ggplot(data, aes(x = x, y = y, label = Group)) +
  geom_point(aes(size = size, colour = Group), show.legend = TRUE) +
  scale_color_manual(values=col) +
  geom_text(size = 4) +
  scale_size(range = c(5,15)) +
  scale_x_continuous(name="x", limits=c(xlim*-1-1,xlim+1))+
  scale_y_continuous(name="y", limits=c(ylim*-1-1,ylim+1))+
  theme_bw()
Run Code Online (Sandbox Code Playgroud)

输出继电器:

在此输入图像描述

数据

data <- read.table("Group    x   y  size    Color
Medium   1   2  2000    yellow
Small   -1   2  1000    red
Large    2  -1  4000    green
Other   -1  -1  2500    blue",head=TRUE)
Run Code Online (Sandbox Code Playgroud)


Sco*_*tyJ 11

一个稍微好一点的解决方案...

当 @scoa 回答这个问题时,我从未听说过 R,而且我不知道我的解决方案是否可用,但是您可以使用scale_color_identity().

library(tidyverse)

data <- tribble(
  ~Group,~x,~y,~size,~Color,
  "Medium",1,2,2000,"yellow",
  "Small",-1, 2,1000,"red",
  "Large",2,-1,4000,"green",
  "Other",-1,-1,2500,"blue")

xlim<-max(c(abs(min(data$x)),abs(max(data$x))))
ylim<-max(c(abs(min(data$y)),abs(max(data$y))))

ggplot(data, aes(x = x, y = y, label = Group)) +
  geom_point(aes(size = size, colour = Color), show.legend = TRUE) +   # Set aes(colour = Color) (the column in the dataframe)
  scale_color_identity() +  # This tells ggplot to use the values explicit in the 'Color' column
  geom_text(size = 4) +
  scale_size(range = c(5,15)) +
  scale_x_continuous(name="x", limits=c(xlim*-1-1,xlim+1))+
  scale_y_continuous(name="y", limits=c(ylim*-1-1,ylim+1))+
  theme_bw()

Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

scale_color_identity()

通过使用它,您不需要创建单独的命名向量scale_color_manual(),您可以直接使用“颜色”列(请注意更改为geom_point(aes(colour = Group,...!!!geom_point(aes(colour = Color,...)。