【问题标题】:specificy different color for different strings in map pie charts in R在R中的地图饼图中为不同的字符串指定不同的颜色
【发布时间】:2019-09-05 21:00:15
【问题描述】:

我正在尝试在不同位置制作一张带有多个饼图的地图。 我的问题是我在循环的不同迭代中添加每个饼图。饼图有一些共同但不同的标签,因此每个切片的颜色不应该总是相同的。有没有办法添加一个参数,指定每次出现每个标签时应该为切片使用哪种颜色??

在我的代码中,我试图绘制 10 个饼图(地图中的 10 个区域),总共有 16 个不同的标签值(我称之为单倍群)。在每次迭代中,我只保留一个区域的值来绘制它们,以便在每次迭代中重新开始颜色...... 我想添加一些类似于我添加的parsection 的内容,但它不起作用...

我已经看到这可以用 ggplot2 中的scale_color_manual 来完成,但是我正在使用的函数不在包中,我认为我应该保留它...

df_all是一个数据框,其中包含需要在饼图中引入的所有信息。使用grepl,我在每次迭代中独立选择每个区域的信息,并且饼图切片应填充频率列。单倍群应该是标签。主要问题是,例如Haplogroup A 的颜色与 Haplogroup C 中的颜色相同(只是因为它们是每个区域的第一个,即使它们不一样)。数据框看起来像这样(但更大):

Region Haplogroup Frequency 1 Region1 A 3 2 Region1 B 1 3 Region2 A 1 4 Region2 D 1 5 Region2 E 1 6 Region3 C 2 7 Region3 B 7 8 Region3 E 2 9 Region4 D 2

coord 数据框包含两列(x 和 y),其中包含饼图应在地图中放置的坐标(每行对应于一个区域)。计数器是一种在每次迭代中选择与下一个区域对应的下一个坐标的方法。 coords 看起来或多或少是这样的:

x y 1.3 14.3 2.5 12.5 1.9 10.4 3.7 11.7

一般来说,我的代码是这样的:

for (i in unique(df_all$Region)){
  counter=counter+1
  d <- df_all[grepl(i, df_all$Region),]
  print(d)
  add.pie(z=d$Frequency, x=coord$x[counter], y=coord$y[counter], radius = 0.005, 
          labels = d$Haplogroup)
    par(col = c("E1b1a7a" = "#A6CEE3", "E1b1a8"= "#428EBF", "R1b"= "#6CADA0",
                "A" = "#7CC171", "E1a" = "#66AB4C", "A3b2" = "#B89B74", "B" = "#E25E57",
                "B2" = "#EE6049", "B2a1" = "#F58242", "E" = "#F99F41", "E1b1" = "#ED8F47",
                "E1b1a" = "#BD93AD", "J1e" = "#9572AB", "L" = "#B19894", "T" = "#E9D27A", 
                "E1b1a7*" = "#B15928"))
}```


Thanks in advance for the help!

【问题讨论】:

  • 您能否编辑问题以包含df_allcounter 的最小版本以及add.pie 的来源以使其可重现?

标签: r


【解决方案1】:

从一个 data.frame 中的所有内容开始,或者手动创建它:

df_all<-read.csv(text="
r, z, x, y,  l, c
1, 3, 3, 13, A,   red
1, 1, 3, 13, B,  blue
2, 1, 1, 12, A2,  pink
2, 2, 1, 12, B2, green
",header=T)

或通过操作然后绑定您当前的数据,例如。 reshape::cast 在坐标上,然后是cbind,等等。

您可以手动输入带有英文名称的颜色(上面的df_all$c),或者添加带有您拥有的或类似颜色的列(下面的df_all$colorsm),或者以编程方式基于某些主题(如图所示)。

library(mapplots)
df_all$colorzm= c("#A6CEE3", "#F58242", "#F99F41", "#ED8F47")#mannually
df_all$colorzp=  topo.colors(nrow(df_all))#programatically

一旦你把所有东西放在一起,你就可以使用更简单的lapply

plot(NA,NA, xlim=c(0,6), ylim=c(10,15) )
lapply(split(df_all,df_all$r),function(s){ #split by region
  add.pie(z=s$z, #your proportions
          x=s$x,
          y=s$y,
          labels=s$l, #your haplotypes
          col = s$colorzp)
})

结果:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-10-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-09
    • 1970-01-01
    相关资源
    最近更新 更多