需要:人口分割的重复象形图可视化

7
我正在寻找一种可视化方式,用几个类别将一个包含N个单位的人口分割,并通过一组N个象形图 - 我更喜欢填充的正方形; 在报纸等媒体上,可能会看到小人形状 - 每个象形图都按第n个单位的类别着色。 N固定为1或100,并且显示部分或百分比而不是计数的图表将是可以接受的。彩色“条纹”必须包裹到多行。是否有人知道这种图表在R软件包中可用吗?
以具体例子为例,
x = sample(c("A","B"),100,replace = T)
我想看到一个10x10(或5x20等)彩色正方形网格,其中一些 - 对应于“A”的正方形 - 被涂成绿色,其他则涂成红色。 绿色(以及同样的红色)正方形可以被“聚集”或保留原始顺序。
谢谢。
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 = "")

enter image description here

Circles

# 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 = "")

enter image description here

png图标 这个解决方案使用了一个黑白的男人图标,我们假设它已经保存在当前目录下并命名为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绿色/红色,并添加使用人物图标的版本。


5

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")

simple counts

counts of travellers


2

这位用户在 ggplot2 Google 群组中请求一个 ggplot2 的解决方案,所以我也在此发布:

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)

enter image description here


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接