我正在使用 R 编程语言。
最近,我看到这篇文章How can i make a stacked multiple Density Plot with ggplot? 其中显示了一个非常有趣的图表:
我正在尝试学习如何复制该图。
我首先模拟了该图的数据:
text = c(
"Morena, pvem, pt 307[282-326] Actual 413",
"Morena, PT 263[244-280] Actual 303",
"Morena, pvem 265[243-282] Actual 267",
"PAN, PRI, PRD, MC 193 [167-211] Actual 163",
"PAN,PRI, PRD 180[155-199] Actual 137",
"PAN, PRI 152[131-167] Actual 126",
"PAN, PRD 112[95-125] Actual 89",
"PRI, PRF 97[83-111] Actual 59"
)
means = c(300,250,200,150,140,130,120,110)
data = data.frame()
for(i in seq_along(text)){
random_numbers = rnorm(100, means[i], 10)
df = data.frame(text = text[i], numbers = random_numbers)
data = rbind(data, df)
}
Titles = c(
"Curules totales por bloques legislativos",
"Curules totales",
"Mayoria absoluta",
"Mayoria calificada"
)
Run Code Online (Sandbox Code Playgroud)
然后我尝试复制这个图:
library(ggridges)
data$color <- ifelse(data$text %in% levels(data$text)[5:8], "maroon", "blue")
ggplot(data, aes(x = numbers, y = text, fill = color)) +
geom_density_ridges() +
scale_fill_identity() +
labs(x = "Numbers", y = "Text") +
theme_ridges() +
ggtitle("Ridge Plot of Text vs Numbers")
Run Code Online (Sandbox Code Playgroud)
然而,我的图形看起来与原始图片一点都不像——有人可以告诉我如何制作更接近原始图片的东西吗?
谢谢!
小智 7
\n还有一些工作要做:
\n这是我的代码(基于您已经完成的操作)。通过以富文本格式整理摘要统计数据,可以以更简洁的方式完成标签。
\ntext = c(\n "<span style=\'font-size:9pt; color:#999999\'>MORENA, PVEM, PT</span><br>**307**<span style=\'font-size:9pt; color:#999999\'> [282-326]<br>Actual:</span><span style=\'font-size:9pt; color:black\'>**413**</span>",\n "<span style=\'font-size:9pt; color:#999999\'>MORENA, PT<br></span>**263**<span style=\'font-size:9pt; color:#999999\'> [244-280]<br>Actual:</span><span style=\'font-size:9pt; color:black\'>**303**</span>",\n "<span style=\'font-size:9pt; color:#999999\'>MORENA, PVEM <br></span>**265**<span style=\'font-size:9pt; color:#999999\'> [243-282]<br>Actual:</span><span style=\'font-size:9pt; color:black\'>**267**</span>",\n "<span style=\'font-size:9pt; color:#999999\'>PAN, PRI, PRD, MC <br></span>**193**<span style=\'font-size:9pt; color:#999999\'> [167-211]<br>Actual:</span><span style=\'font-size:9pt; color:black\'>**163**</span>",\n "<span style=\'font-size:9pt; color:#999999\'>PAN,PRI, PRD <br></span>**180**<span style=\'font-size:9pt; color:#999999\'> [155-199]<br>Actual:</span><span style=\'font-size:9pt; color:black\'>**137**</span>",\n "<span style=\'font-size:9pt; color:#999999\'>PAN, PRI<br></span>**152**<span style=\'font-size:9pt; color:#999999\'> [131-167]<br>Actual:</span><span style=\'font-size:9pt; color:black\'>**126**</span>",\n "<span style=\'font-size:9pt; color:#999999\'>PAN, PRD<br></span>**112**<span style=\'font-size:9pt; color:#999999\'> [95-125]<br>Actual:</span><span style=\'font-size:9pt; color:black\'>**89**</span>",\n "<span style=\'font-size:9pt; color:#999999\'>PRI, PRF<br></span>**97**<span style=\'font-size:9pt; color:#999999\'> [83-111]<br>Actual:</span><span style=\'font-size:9pt; color:black\'>**59**</span>"\n)\n\n\nmeans = c(310,270,260,190,170,150,110,100)\n\ndata = data.frame()\n\nfor(i in seq_along(text)){\n \n random_numbers = rnorm(1500, means[i], 10+rpois(1,lambda = 4))\n \n df = data.frame(text = text[i], numbers = random_numbers)\n \n data = rbind(data, df)\n}\n\nTitles = c(\n "Curules totales por bloques legislativos",\n "Curules totales",\n "**Mayor\xc3\xada<br>absoluta**",\n "**Mayor\xc3\xada<br>calificada**"\n)\n\nlibrary(ggridges)\nlibrary(ggtext)\n\n\ndata$color <- ifelse(data$text %in% text[1:3], "#792C32", "#537DAB")\n\nx_labels = c(as.character(seq(100,200,50)),"<b>250</b>","300","350")\n\ntest = ggplot(data, aes(x = numbers, y = fct_reorder(text,numbers,mean), fill = color)) +\n geom_density_ridges(stat = "binline",\n bins = 150,\n #scale = 0.95,\n draw_baseline = FALSE,\n color = NA,alpha = 0.8) +\n # geom_rect(aes(xmin = 50, xmax = 250, ymin = 1, ymax = 9),col = NA,fill = "white",alpha = 0.006)+\n geom_segment(aes(x = 250, y = 1, xend = 250, yend = 9), linewidth = 0.3,col="black")+\n geom_segment(aes(x = 326, y = 1, xend = 326, yend = 9), linewidth = 0.3,col="black")+\n geom_richtext(data = data.frame(text = Titles[4],\n y = 9.5),inherit.aes = F,\n aes(x = 326, y = y, label = text),\n fill=NA,label.color = NA,hjust = 0.5,vjust=1,size=2.5)+\n scale_fill_identity() +\n geom_richtext(data = data.frame(text = Titles[3],\n y = 9.5),inherit.aes = F,\n aes(x = 250, y = y, label = text),\n fill=NA,label.color = NA,hjust = 0.5,vjust=1,size=2.5)+\n geom_richtext(data = data.frame(text,y = seq(8.5,1.5,-1)),inherit.aes = F,\n aes(x = 50, y = y, label = text),\n fill=NA,label.color = NA,hjust = 1)+\n scale_x_continuous(limits = c(0,360),\n breaks = seq(100,350,50),\n labels = x_labels)+\n scale_y_discrete(expand = c(0.0, 0))+\n labs(title = Titles[1],\n x = Titles[2],\n y = "") +\n theme_minimal()+\n theme(panel.grid.major.y = element_line(linewidth = 0.3,colour = "black"),\n panel.grid.minor.x = element_blank(),\n axis.ticks.x = element_blank(),\n axis.ticks = element_blank(),\n axis.ticks.y = element_blank(),\n axis.text.y = element_blank(),\n axis.text.x = element_markdown())\nRun Code Online (Sandbox Code Playgroud)\n