按R中的因子着色图

Lov*_*eow 27 plot r colors r-factor

我正在制作两个变量的散点图,并希望通过因子变量对点进行着色.这是一些可重现的代码:

data <- iris
plot(data$Sepal.Length, data$Sepal.Width, col=data$Species)
Run Code Online (Sandbox Code Playgroud)

这一切都很好,但我怎么知道什么因素被涂上了什么颜色?

Mai*_*ura 50

data<-iris
plot(data$Sepal.Length, data$Sepal.Width, col=data$Species)
legend(7,4.3,unique(data$Species),col=1:length(data$Species),pch=1)
Run Code Online (Sandbox Code Playgroud)

应该为你做.但我更喜欢ggplot2并建议在R中使用更好的图形.

  • 建议将ggplot2用于"R中更好的图形"是错误的.标准R绘图功能具有更大的潜力. (22认同)
  • 您好,我想指出的是,这种设置图例颜色的方法可以将它们混淆。最好使用下面的方法,在约翰的评论中。调用“levels”而不是“unique”来从因子中获取可能的值。 (3认同)
  • 使用此方法时要格外小心,因为此代码中的颜色通常不是正确的种类。您确实确实需要首先为种类编号添加一列,然后根据目标变量对数据框进行排序,然后为该颜色绘制并引用该种类编号。或者,如其他因素所述,使用level(),如果它是一个因素。 (2认同)

Joh*_*ohn 37

该命令palette告诉您颜色及其顺序col = somefactor.它也可以用来设置颜色.

palette()
[1] "black"   "red"     "green3"  "blue"    "cyan"    "magenta" "yellow"  "gray"   
Run Code Online (Sandbox Code Playgroud)

为了在图表中看到您可以使用图例.

legend('topright', legend = levels(iris$Species), col = 1:3, cex = 0.8, pch = 1)
Run Code Online (Sandbox Code Playgroud)

你会注意到我只用3个数字指定了新颜色.这将像使用因素一样工作.我本可以使用最初用于为点着色的因子.这会让一切都在逻辑上流动......但我只想告诉你可以使用各种各样的东西.

你也可以具体说明颜色.尝试?rainbow初学者并从那里开始.您可以指定自己的或让R为您做.只要你使用相同的方法,你就可以了.


Mat*_*ert 19

像Maiasaura一样,我更喜欢ggplot2.透明参考手册是其中一个原因.但是,这是完成它的一种快速方法.

require(ggplot2)
data(diamonds)
qplot(carat, price, data = diamonds, colour = color)
# example taken from Hadley's ggplot2 book
Run Code Online (Sandbox Code Playgroud)

并且引起有名人士说,情节相关帖子没有完整没有情节,这里的结果如下:

在此输入图像描述

这里有几个参考: qplot.R示例,注意基本上这使用了我使用的相同的钻石数据集,但之前裁剪数据以获得更好的性能.

http://ggplot2.org/book/ 手册:http://docs.ggplot2.org/current/


Tob*_*oby 16

我知道有两种方法可以按因子对绘图点进行着色,然后自动生成相应的图例.我将举两个例子:

  1. 使用ggplot2(通常更容易)
  2. 使用R的内置绘图功能与功能相结合colorRampPallete(更棘手,但很多人更喜欢/需要R的内置绘图设施)

对于这两个示例,我将使用ggplot2钻石数据集.我们将使用数字列diamond$caratdiamond$price因子/分类列diamond$color.如果安装了ggplot2,则可以使用以下代码加载数据集:

library(ggplot2)
data(diamonds)
Run Code Online (Sandbox Code Playgroud)

使用ggplot2和qplot

这是一个班轮.这里的关键项是将qplot您想要着色的因子作为color参数.qplot默认情况下会为你制作一个传奇.

qplot(
  x = carat,
  y = price,
  data = diamonds,
  color = diamonds$color # color by factor color (I know, confusing)
)
Run Code Online (Sandbox Code Playgroud)

您的输出应如下所示: qplot输出由因子

使用R的内置绘图功能

使用R的内置绘图功能来获得由因子和相关图例着色的绘图是一个4步骤的过程,它比使用ggplot2更具技术性.

首先,我们将发挥colorRampPallete作用.colorRampPallete()返回一个将生成颜色列表的新函数.在下面的代码段中,调用color_pallet_function(5)将返回从红色到橙色到蓝色的5种颜色的列表:

color_pallete_function <- colorRampPalette(
  colors = c("red", "orange", "blue"),
  space = "Lab" # Option used when colors do not represent a quantitative scale
  )
Run Code Online (Sandbox Code Playgroud)

其次,我们需要制作一个颜色列表,每种钻石颜色只有一种颜色.这是我们将用于为各个绘图点指定颜色以及创建我们的图例的映射.

num_colors <- nlevels(diamonds$color)
diamond_color_colors <- color_pallet_function(num_colors)
Run Code Online (Sandbox Code Playgroud)

第三,我们创造了我们的情节.这可以像你可能做的任何其他情节一样完成,除了我们引用我们作为col参数的颜色列表.只要我们总是使用相同的列表,我们的颜色之间的映射diamond$colors将在我们的R脚本中保持一致.

plot(
  x = diamonds$carat,
  y = diamonds$price,
  xlab = "Carat",
  ylab = "Price",
  pch = 20, # solid dots increase the readability of this data plot
  col = diamond_color_colors[diamonds$color]
)
Run Code Online (Sandbox Code Playgroud)

第四个也是最后一个,我们添加了我们的图例,以便有人阅读我们的图表可以清楚地看到绘图点颜色和实际钻石颜色之间的映射.

legend(
  x ="topleft",
  legend = paste("Color", levels(diamonds$color)), # for readability of legend
  col = diamond_color_colors,
  pch = 19, # same as pch=20, just smaller
  cex = .7 # scale the legend to look attractively sized
)
Run Code Online (Sandbox Code Playgroud)

您的输出应如下所示: 标准R绘图输出由因子

漂亮,对吧?


Aar*_*ica 11

lattice库是另一个不错的选择.在这里,我在右侧添加了一个图例,并因为其中一些重叠而抖动了这些点.

xyplot(Sepal.Width ~ Sepal.Length, group=Species, data=iris, 
       auto.key=list(space="right"), 
       jitter.x=TRUE, jitter.y=TRUE)
Run Code Online (Sandbox Code Playgroud)

示例情节

  • +1为格子.当被问到这样的问题时,我常常太自动= ggplot. (2认同)

jus*_*618 9

col在参数plot函数自动分配颜色整数向量.如果您转换iris$Species为数字,请注意您有1,2和3s的向量因此您可以将其应用为:

plot(iris$Sepal.Length, iris$Sepal.Width, col=as.numeric(iris$Species))
Run Code Online (Sandbox Code Playgroud)

假设您想要红色,蓝色和绿色而不是默认颜色,那么您可以简单地调整它:

plot(iris$Sepal.Length, iris$Sepal.Width, col=c('red', 'blue', 'green')[as.numeric(iris$Species)])
Run Code Online (Sandbox Code Playgroud)

您可以看到如何进一步修改上面的代码以获得任何独特的颜色组合.