如何在 R Plotly 中基于分类变量创建叶绿体图?

mgr*_*fin 3 maps r categorical-data plotly

我正在尝试创建美国的叶绿体地图,该地图使用分类变量作为州颜色,但我只得到一张空白地图。绘图地图与分类数据兼容吗?如果是这样,语法如何改变?

对于我的数据,我只是上传一个由状态和随机的“好”、“坏”、“好”之一组成的行表。

我可以在下面的代码中更改什么才能使其正常工作?我尝试了一种解决方法,可以稍微改变状态的颜色,但颜色条变得不稳定。(value4 是我的“好”、“坏”、“好”的分类变量)

如果我的问题不清楚或者我的信息不太好,我深表歉意。如果有人有进一步的问题,我可以回答。提前致谢

foo <- brewer.pal(n = 3,
                        name = "Set1")

df <- mutate(df, test = ntile(x = value4, n = 3))

cw_map <- plot_ly(
  data = df,
  type = "choropleth",
  locations = ~ state,
  locationmode = "USA-states",
  color = ~ test,
  colors = foo[df$test],
  z = ~ test
) %>%
  layout(geo = list(scope = "usa"))

print(cw_map)
Run Code Online (Sandbox Code Playgroud)

Stu*_*olf 5

您需要以代码形式提供状态,所以让我们从以下开始:

STATES <-c("AL", "AK", "AZ", "AR", "CA", "CO", "CT", "DE", "FL", "GA", 
"HI", "ID", "IL", "IN", "IA", "KS", "KY", "LA", "ME", "MD", "MA", 
"MI", "MN", "MS", "MO", "MT", "NE", "NV", "NH", "NJ", "NM", "NY", 
"NC", "ND", "OH", "OK", "OR", "PA", "RI", "SC", "SD", "TN", "TX", 
"UT", "VT", "VA", "WA", "WV", "WI", "WY")
Run Code Online (Sandbox Code Playgroud)

就像您所做的那样,我们为每个状态提供随机值4:

df = data.frame(state=STATES,
value4=sample(c("Good", "Bad", "OK."),length(STATES),replace=TRUE))
Run Code Online (Sandbox Code Playgroud)

然后我们将您的 value4 作为因子,以及颜色等,就像您之前所做的那样:

df$value4 = factor(df$value4)
df$test = as.numeric(df$value4)
nfactor = length(levels(df$value4))
foo <- brewer.pal(n = nfactor,name = "Set1")
names(foo) = levels(df$value4)
Run Code Online (Sandbox Code Playgroud)

要以离散形式显示颜色图例,您需要将其作为数据框提供,该数据框定义z 相对比例的中断。R 中的plotly 没有很好地记录它,我根据@emphet 的plotly 论坛帖子@marcosandri 的SO 帖子中的信息编写了以下n 个因素的解决方案:

Z_Breaks = function(n){
CUTS = seq(0,1,length.out=n+1)
rep(CUTS,ifelse(CUTS %in% 0:1,1,2))
}

colorScale <- data.frame(z=Z_Breaks(nfactor),
col=rep(foo,each=2),stringsAsFactors=FALSE)

          z     col
1 0.0000000 #E41A1C
2 0.3333333 #E41A1C
3 0.3333333 #377EB8
4 0.6666667 #377EB8
5 0.6666667 #4DAF4A
6 1.0000000 #4DAF4A
Run Code Online (Sandbox Code Playgroud)

我们绘制:

cw_map <- plot_ly(
  data = df,
  type = "choropleth",
  locations = ~ state,
  locationmode = "USA-states",
  z = df$test,
  colorscale=colorScale,
  colorbar=list(tickvals=1:nfactor, ticktext=names(foo))
) %>%
layout(geo = list(scope = "usa")) 
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

  • 我帮助OP解决了他/她之前的问题,并遇到了传说问题。正如您所看到的,图例中也有连续值。这就是OP想要解决的问题。我无法处理这个传奇问题。这就是OP提出这个问题的原因。知道如何处理图例问题吗? (2认同)