朝阳中的定位标签和颜色编码-R

时间:2019-07-17 07:34:52

标签: r ggplot2

This is what is the output.我有一个数据集,其中包含2016年的单位,每个单位的权重和每个单位的合规分数。 I was not able to add the table but here is the screenshot for the data in csv

我已将数据中的列命名为单位,重量和年份(这是合规性得分)。

我想创建一个朝阳图,其中第一个环将是根据重量划分的单位,第二个环将是相同的,但是将具有标签符合性评分。

每个环的颜色将不同。

借助在线博客,我能够编写一些代码,并且得到的输出与我想要的输出类似,但是我在定位标签以及每个环的颜色编码方面都遇到了困难

#using ggplot
library(ggplot2) # Visualisation
library(dplyr) # data wrangling
library(scales) # formatting

#read file
weight.eg = read.csv("Dummy Data.csv", header = FALSE, sep = 
";",encoding = "UTF-8") 

#change column names
colnames(weight.eg) <- c ("unit","weight","year")

#as weight column is factor change into integer
weight.eg$weight = as.numeric(levels(weight.eg$weight)) 
[as.integer(weight.eg$weight)]
weight.eg$year = as.numeric(levels(weight.eg$year)) 
[as.integer(weight.eg$year)]
#Nas are introduced, remove
weight.eg <- na.omit(weight.eg)

#Sum of the total weight
sum_total_weight = sum(weight.eg$weight)

#First layer
firstLevel = weight.eg %>% summarize(total_weight=sum(weight))
sunburst_0 = ggplot(firstLevel) # Just a foundation

#this will generate a bar chart 
sunburst_1 = 
sunburst_0 + 
geom_bar(data=firstLevel, aes(x=1, y=total_weight), 
fill='darkgrey', stat='identity') +
geom_text(aes(x=1, y=sum_total_weight/2, label=paste("Total 
Weight", comma(total_weight))), color='black')
#View  
sunburst_1
#this argument is used to rotate the plot around the y-axis which 
the total weight 
sunburst_1 + coord_polar(theta = "y")

sunburst_2=
sunburst_1 +
geom_bar(data=weight.eg,
       aes(x=2, y=weight.eg$weight, fill=weight.eg$weight),
       color='white', position='stack', stat='identity', size=0.6) 
+ 
geom_text(data=weight.eg, aes(label=paste(weight.eg$unit, 
weight.eg$weight), x=2, y=weight.eg$weight), position='stack')

sunburst_2 + coord_polar(theta = "y") 

sunburst_3 =
sunburst_2 +
geom_bar(data=weight.eg,
       aes(x=3, y=weight.eg$weight,fill=weight.eg$weight),
       color='white', position='stack', stat='identity', 
size=0.6)+
geom_text(data = weight.eg, 
aes(label=paste(weight.eg$year),x=3,y=weight.eg$weight),position = 
'stack')  


sunburst_3 + coord_polar(theta = "y") 

sunburst_3 + scale_y_continuous(labels=comma) + 
scale_fill_continuous(low='white', high='darkred') + 
coord_polar('y') + theme_minimal()

Output for dput(weight.eg)
structure(list(unit = structure(2:7, .Label = c("", "A", "B", 
"C", "D", "E", "F", "Unit"), class = "factor"), weight = c(30, 
25, 10, 17, 5, 13), year = c(70, 80, 50, 30, 60, 40)), .Names = 
c("unit", 
"weight", "year"), row.names = 2:7, class = "data.frame", na.action 
= structure(c(1L, 
8L), .Names = c("1", "8"), class = "omit"))

output for dput(firstLevel)
structure(list(total_weight = 100), .Names = "total_weight", row.names 
= c(NA, 
-1L), na.action = structure(c(1L, 8L), .Names = c("1", "8"), class = 
"omit"), class = "data.frame") 

1 个答案:

答案 0 :(得分:1)

所以我想我可能会为您提供某种解决方案。我不确定您要在外圈上进行颜色编码吗?从您的代码看来,您似乎希望再次成为重担,但这对我来说并不明显。对于每个环不同的色标,可以使用ggnewscale包:

library(ggnewscale)

要使标签居中,可以编写一个函数:

cs_fun <- function(x){(cumsum(x) + c(0, cumsum(head(x , -1))))/ 2}

现在绘图代码可能看起来像这样:

ggplot(weight.eg) +
  # Note: geom_col is equivalent to geom_bar(stat = "identity")
  geom_col(data = firstLevel,
           aes(x = 1, y = total_weight)) +
  geom_text(data = firstLevel,
            aes(x = 1, y = total_weight / 2, 
                label = paste("Total Weight:", total_weight)),
            colour = "black") +
  geom_col(aes(x = 2, 
               y = weight, fill = weight),
           colour = "white", size = 0.6) +
  scale_fill_gradient(name = "Weight", 
                      low = "white", high = "darkred") +
  # Open up new fill scale for next ring
  new_scale_fill() +
  geom_text(aes(x = 2, y = cs_fun(weight), 
                label = paste(unit, weight))) +
  geom_col(aes(x = 3, y = weight, fill = weight), 
           size = 0.6, colour = "white") +
  scale_fill_gradient(name = "Another Weight?", 
                      low = "forestgreen", high = "white") +
  geom_text(aes(label = paste0(year), x = 3, 
                y = cs_fun(weight))) +
  coord_polar(theta = "y")

看起来像这样:

enter image description here