7

我正在寻找一种方法来进行(实际上很常见)可视化,通过一组 N 象形图显示将 N 个单位的人口分成几个类别 - 我更喜欢实心方块;在报纸等上,人们可能会看到一些小的人形形状——每个象形图都根据第 n 个单元的类别着色。N 固定为 1 或 100,图表显示分数或百分比而不是计数,就可以了。彩色“条纹”必须换成多行。有人知道这个图表在 R 包中可用吗?

举一个具体的例子,

x = 样本(c("A","B"),100,替换 = T)

我想看到一个 10x10(或 5x20,或其他)的彩色方块网格,一些 - 对应于“A” - 为绿色,其他为红色。绿色(同样是红色)方格可以“成束”,或按原始顺序保留。

谢谢你。

4

4 回答 4

8

下面我们展示3个版本。第一个使用正方形,下一个使用圆形,下一个使用一个男人的图标,最后我们使用笑脸。

正方形

# input data
set.seed(123)
x <- sample(c("A","B"),100,replace = T)

# input parameters - nr * nc should equal length(x)
cols <- c("green", "red")
nr <- 10
nc <- 10

# create data.frame of positions and colors
m <- matrix(cols[factor(x)], nr, nc)
DF <- data.frame(row = c(row(m)), col = c(col(m)[, nc:1]), value = c(m), 
      stringsAsFactors = FALSE)

# plot squares - modify cex to get different sized squares
plot(col ~ row, DF, col = DF$value, pch = 15, cex = 4, asp = 1,
     xlim = c(0, nr), ylim = c(0, nc),
     axes = FALSE, xlab = "", ylab = "")

在此处输入图像描述

# plot circles
plot(col ~ row, DF, col = DF$value, pch = 20, cex = 6, asp = 1,
     xlim = c(0, nr), ylim = c(0, nc),
     axes = FALSE, xlab = "", ylab = "")

在此处输入图像描述

png Icons此解决方案使用一个人的黑白图标,我们假设该图标已保存在当前目录中为man.png. 我们将其着色为红色和绿色,并使用这两个版本代替正方形或圆形:

# blank graph to insert man icons into
plot(col ~ row, DF, col = DF$value, asp = 1,
     xlim = c(0, nr), ylim = c(0, nc),
     axes = FALSE, xlab = "", ylab = "", type = "n")

library(png)
man <- readPNG("man.png")

red.man <- man
red.man[,,1] <- man[,,4] # fill in red dimension
R <- subset(DF, value == "red")
with(R, rasterImage(red.man, 
     row-.5, col-.5, row+.5, col+.5, 
     xlim = c(0, nr), ylim = c(0, nc),
     xlab = "", ylab = ""))

green.man <- man
green.man[,,2] <- man[,,4] # fill in green dimension
G <- subset(DF, value == "green")
with(G, rasterImage(green.man, 
     row-.5, col-.5, row+.5, col+.5, 
     xlim = c(0, nr), ylim = c(0, nc),
     xlab = "", ylab = ""))

在此处输入图像描述

笑脸图标此解决方案使用绿色笑脸图标红色皱眉脸图标,我们假设它们已保存在当前目录中,分别为smiley_green.jpgsmiley_red.jpg

# blank graph to insert man icons into
xp <- 1.25
plot(col ~ row, DF, col = DF$value, asp = 1,
     xlim = c(0, xp * nr), ylim = c(0, xp * nc),
     axes = FALSE, xlab = "", ylab = "", type = "n")

library(jpeg)
smiley_green <- readJPEG("smiley_green.jpg")
smiley_red <- readJPEG("smiley_red.jpg")    

R <- subset(transform(DF, row = xp * row, col = xp * col), value == "red")
with(R, rasterImage(smiley_red,
     row - .5, col - .5, row + .5, col + .5, 
     xlim = c(0, xp * nr), ylim = c(0, xp * nc),
     xlab = "", ylab = ""))

G <- subset(transform(DF, row = xp * row, col = xp * col), value == "green")
with(G, rasterImage(smiley_green,
     row - .5, col - .5, row + .5, col + .5, 
     xlim = c(0, xp * nr), ylim = c(0, xp * nc),
     xlab = "", ylab = ""))

在此处输入图像描述

修改为 10x10 绿色/红色并添加了使用人图标的版本。

于 2014-12-10T16:55:48.397 回答
5

答对了。我的祈祷得到了回应

http://rud.is/b/2015/03/18/making-waffle-charts-in-r-with-the-new-waffle-package/

(但非常感谢前面提出的解决方案)。

# devtools::install_github("hrbrmstr/waffle")
library(waffle)
x <- sample(c("A","B"),100,replace = T)
x <- c(A=sum(x=="A"), B=sum(x=="B"))
waffle(x, rows=10, colors=c("red", "green"))

在此处输入图像描述

于 2015-03-20T10:05:12.517 回答
3

我还为此制作了一个包裹(几乎与其他人同时:-)。它具有三种方法,使用 geom_tile、geom_text(例如使用 FontAwesome 图标)和 geom_point。后两者可以做阴影,但有时你必须修改设置。这里还有一些例子

devtools::install_github("rubenarslan/formr")
library(formr)
qplot_waffle(rep(1:3,each=40,length.out=90))
library(ggplot2)
qplot_waffle_text(rep(1, each = 30), symbol = "", rows = 3) + ggtitle("Number of travellers in 2008")

简单计数

旅客人数

于 2015-03-24T17:28:41.753 回答
2

OP 要求ggplot2在 ggplot2 Google 组上提供解决方案,因此我也将其发布在这里:

ggplot(DF, aes(row, col, fill=value)) + 
  geom_tile(colour="white", lwd=2) + 
  scale_fill_manual(values=c("green","red")) +
  theme(panel.background=element_blank(),
        axis.text=element_blank(),
        axis.ticks=element_blank(),
        axis.title=element_blank()) +
  guides(fill=FALSE)

在此处输入图像描述

于 2015-01-22T20:18:17.303 回答