在ggplot中添加符号作为标签

时间:2017-10-31 19:57:39

标签: r ggplot2 maps ggmap

我有一个R脚本,突出显示美国地图上的某些州。我想强调两个功能,我遇到了第二个功能的问题。我附上了当前地图的样子。

  1. 如果他们的债券评级低于某一等级(这可行),则将整个州的颜色设为红色
  2. 如果评级在过去几年呈下降趋势,请在债券评级旁边给出一个红色向下箭头作为该州的标签。这些已经在df" dtrend"中被标记和过滤。下面。
  3. 非常感谢任何帮助。谢谢。

    #cleanup
    statedata <- read.csv(file = "statebondratingsmelted.csv", header = TRUE) 
    head(statedata)
    summary(statedata)
    
    statedata <- subset(statedata, Year==2017)
    statedata$Rank = as.numeric(levels(statedata$Rank))[statedata$Rank]
    statedata$region <- tolower(statedata$region)
    snames <- data.frame(region=tolower(state.name), long=state.center$x, lat=state.center$y)
    snames <- merge(snames, statedata, by="region")
    dtrend <- filter(mergestate, downwardtrendflag==1)
    aaflag <- filter(mergestate, aa_flag==1)
    us <- map_data("state")
    mergestate <- merge(statedata, us, by="region")
    
    library(ggplot2)
    library(ggmap)
    
    # Map Code
    ggplot(color="black") +
        geom_map(data=us, map=us, aes(long, lat, map_id=region), fill="white", color = "#000000")+
        geom_map(data=dtrend, map=us, aes(fill="red", map_id=region), color ="#000000")+
        geom_map(data=aaflag, map=us, aes(fill="red", map_id=region), color ="#000000")+    
        geom_text(data=snames, aes(long, lat, label=Rating), size=3.0, color = "black")+
        coord_map() 
    

    这是当前的输出:

    Current Map

    statedata <- structure(list(region = c("alabama", "alaska", "arizona", "arkansas", 
    "california", "colorado", "connecticut", "delaware", "florida", 
    "georgia", "hawaii", "idaho", "illinois", "indiana", "iowa", 
    "kansas", "kentucky", "louisiana", "maine", "maryland", "massachusetts", 
    "michigan", "minnesota", "mississippi", "missouri", "montana", 
    "nebraska", "nevada", "new hampshire", "new jersey", "new mexico", 
    "new york", "north carolina", "north dakota", "ohio", "oklahoma", 
    "oregon", "pennsylvania", "rhode island", "south carolina", "south dakota", 
    "tennessee", "texas", "utah", "vermont", "virginia", "washington", 
    "west virginia", "wisconsin", "wyoming"), Year = c(2017L, 2017L, 
    2017L, 2017L, 2017L, 2017L, 2017L, 2017L, 2017L, 2017L, 2017L, 
    2017L, 2017L, 2017L, 2017L, 2017L, 2017L, 2017L, 2017L, 2017L, 
    2017L, 2017L, 2017L, 2017L, 2017L, 2017L, 2017L, 2017L, 2017L, 
    2017L, 2017L, 2017L, 2017L, 2017L, 2017L, 2017L, 2017L, 2017L, 
    2017L, 2017L, 2017L, 2017L, 2017L, 2017L, 2017L, 2017L, 2017L, 
    2017L, 2017L, 2017L), Rating = structure(c(4L, 4L, 4L, 4L, 5L, 
    4L, 5L, 7L, 7L, 7L, 6L, 6L, 9L, 7L, 7L, 5L, 3L, 4L, 4L, 7L, 6L, 
    5L, 6L, 4L, 7L, 4L, 7L, 4L, 4L, 2L, 6L, 6L, 7L, 6L, 6L, 6L, 6L, 
    5L, 4L, 6L, 7L, 7L, 7L, 7L, 6L, 7L, 6L, 5L, 4L, 6L), .Label = c("A", 
    "A-", "A+", "AA", "AA-", "AA+", "AAA", "BBB", "BBB-", "N/A"), class = "factor"), 
        Rank = c(3, 3, 3, 3, 4, 3, 4, 1, 1, 1, 2, 2, 10, 1, 1, 4, 
        5, 3, 3, 1, 2, 4, 2, 3, 1, 3, 1, 3, 3, 7, 2, 2, 1, 2, 2, 
        2, 2, 4, 3, 2, 1, 1, 1, 1, 2, 1, 2, 4, 3, 2), downwardtrendflag = structure(c(1L, 
        2L, 1L, 1L, 1L, 1L, 2L, 1L, 1L, 1L, 1L, 1L, 2L, 1L, 1L, 2L, 
        1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 1L, 
        1L, 1L, 2L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
        1L, 2L, 1L, 2L), .Label = c("0", "1", "FALSE"), class = "factor"), 
        aa_flag = c(0L, 0L, 0L, 0L, 1L, 0L, 1L, 0L, 0L, 0L, 0L, 0L, 
        1L, 0L, 0L, 1L, 1L, 0L, 0L, 0L, 0L, 1L, 0L, 0L, 0L, 0L, 0L, 
        0L, 0L, 1L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 1L, 0L, 0L, 0L, 0L, 
        0L, 0L, 0L, 0L, 0L, 1L, 0L, 0L)), .Names = c("region", "Year", 
    "Rating", "Rank", "downwardtrendflag", "aa_flag"), row.names = c(NA, 
    50L), class = "data.frame")
    

1 个答案:

答案 0 :(得分:0)

问题的关键部分是询问如何绘制刻度。如果你使用符号的unicode,符号的行为就像ggplot中的文本一样,并且先前在这里回答:Adding arrow symbols in ggplot text in R

你的问题有点复杂,因为你想用不同的颜色绘制箭头。因此,此脚本会为箭头的绘图添加另一个图层。

您的数据的列downwardtrendflag为1或0.我使用它来使用unicode“\ u2193”为数据创建标签。我改变了数据子集的方式,因为它有点令人困惑。

# Assign arrow to flagged states
library(plyr)
library(ggplot2)
library(ggmap)

us <- map_data("state")

# Format the data
statedata <- subset(statedata, Year==2017)
statedata$Rank = as.numeric(levels(statedata$Rank))[statedata$Rank]
statedata$region <- tolower(statedata$region)

snames <- data.frame(region=tolower(state.name), long=state.center$x, lat=state.center$y)
snames <- merge(snames, statedata, by="region")

# Find states which have either a downward trend or aa flag
highlight <- filter(mergestate, downwardtrendflag==1 | aa_flag==1)

# Create label for snames
snames$downwardtrendflag <- mapvalues(snames$downwardtrendflag, from = c(0,1), to = c("", '\u2193'))

要绘制箭头,我必须制作另一个geom图层,因为您希望颜色为红色。我使用参数nudge_x来抵消箭头。

# Map Code
ggplot(color="black") +
  geom_map(data=us, map=us, aes(long, lat, map_id=region), fill="white", color = "#000000") +
  geom_map(data=highlight, map=us, aes(map_id=region), fill="#F8766D", color ="#000000") +
  geom_text(data=snames, aes(long, lat, label=Rating), size=3.0, color = "black") +
  geom_text(data=snames, aes(long, lat, label=downwardtrendflag), size=3.0, color = "red", nudge_x = 2)+
  coord_map() +
  theme_nothing()

enter image description here

从视觉上看,这张地图并不太棒,因为这两组标签存在冲突。你最好将评级作为一个等值线图绘制,然后将箭头覆盖在有问题的状态上,如下所示:

# First we must order the levels in the factor
snames$Rating <- factor(snames$Rating, levels = rev(c("BBB-", "A-","A+","AA-","AA","AA+" ,"AAA")))

# Map Code
ggplot(color="black") +
  geom_map(data=snames, map=us, aes(map_id=region, fill = Rating), color = "#000000") +
  geom_map(data=highlight, map=us, aes(map_id=region), fill="#F8766D", color ="#000000") +
  geom_text(data=snames, aes(long, lat, label=downwardtrendlabel), size=3.0, color = "red")+
  scale_fill_brewer(palette = "Reds") +
  coord_map(ylim = c(25, 50)) + 
  labs(title = " US States Debt Rating", subtitle = " Arrows highlights states which have a dowward trend", caption = "Source: Add source of data") +
  theme_nothing(legend = TRUE)

enter image description here