scale_x_discrete ggtitle ggplot change r ggplot2 heatmap circular donut-chart

ggtitle - ggplot2 Circular Heatmap que se parece a una dona



ggplot title size (2)

Aquí hay una solución que se logra al (1) convertir el factor a numérico y agregar un desplazamiento, (2) especificar manualmente los límites yy (3) configurar manualmente las roturas y etiquetas del eje y:

library(reshape) library(ggplot2) # Using ggplot2 0.9.2.1 nba <- read.csv("http://datasets.flowingdata.com/ppg2008.csv") nba$Name <- with(nba, reorder(Name, PTS)) nba.m <- melt(nba) nba.m <- ddply(nba.m, .(variable), transform, value = scale(value)) # Convert the factor levels to numeric + quanity to determine size of hole. nba.m$var2 = as.numeric(nba.m$variable) + 15 # Labels and breaks need to be added with scale_y_discrete. y_labels = levels(nba.m$variable) y_breaks = seq_along(y_labels) + 15 p2 = ggplot(nba.m, aes(x=Name, y=var2, fill=value)) + geom_tile(colour="white") + scale_fill_gradient(low = "white", high = "steelblue") + ylim(c(0, max(nba.m$var2) + 0.5)) + scale_y_discrete(breaks=y_breaks, labels=y_labels) + coord_polar(theta="x") + theme(panel.background=element_blank(), axis.title=element_blank(), panel.grid=element_blank(), axis.text.x=element_blank(), axis.ticks=element_blank(), axis.text.y=element_text(size=5)) ggsave(filename="plot_2.png", plot=p2, height=7, width=7)

Intento crear un mapa de calor circular con ggplot2 para poder usar una gran cantidad de etiquetas alrededor de la circunferencia de un círculo. Me gustaría que pareciera más un donut con un agujero vacío en el medio, pero al mismo tiempo no perdiera ninguna fila (tendrían que comprimirse). ¿Algunas ideas? Código para lo que tengo está abajo. ¡Gracias!

library(reshape) library(ggplot2) nba <- read.csv("http://datasets.flowingdata.com/ppg2008.csv") nba$Name <- with(nba, reorder(Name, PTS)) nba.m <- melt(nba) nba.m <- ddply(nba.m, .(variable), transform, value = scale(value)) p = ggplot(nba.m, aes(Name,variable)) + geom_tile(aes(fill = value), colour = "white") + scale_fill_gradient(low = "white", high = "steelblue") p<-p+opts( panel.background=theme_blank(), axis.title.x=theme_blank(), axis.title.y=theme_blank(), panel.grid.major=theme_blank(), panel.grid.minor=theme_blank(), axis.text.x=theme_blank(), axis.ticks=theme_blank() ) p = p + coord_polar() plot(p)


Dirigiéndose al comentario de @ FedericoGiorgi, no a la pregunta original. ¡Gracias a @bdemarest tu solución es increíblemente útil!

Hackear juntos un marco de datos para mostrar las etiquetas, organizarlas muy bien:

nba.labs <- subset(nba.m, variable==levels(nba.m$variable)[nlevels(nba.m$variable)]) nba.labs <- nba.labs[order(nba.labs$Name),] nba.labs$ang <- seq(from=(360/nrow(nba.labs))/1.5, to=(1.5*(360/nrow(nba.labs)))-360, length.out=nrow(nba.labs))+80 nba.labs$hjust <- 0 nba.labs$hjust[which(nba.labs$ang < -90)] <- 1 nba.labs$ang[which(nba.labs$ang < -90)] <- (180+nba.labs$ang)[which(nba.labs$ang < -90)]

Agrega un geom_text para las etiquetas:

p2 = ggplot(nba.m, aes(x=Name, y=var2, fill=value)) + geom_tile(colour="white") + geom_text(data=nba.labs, aes(x=Name, y=var2+1.5, label=Name, angle=ang, hjust=hjust), size=3) + scale_fill_gradient(low = "white", high = "steelblue") + ylim(c(0, max(nba.m$var2) + 1.5)) + scale_y_discrete(breaks=y_breaks, labels=y_labels) + coord_polar(theta="x") + theme(panel.background=element_blank(), axis.title=element_blank(), panel.grid=element_blank(), axis.text.x=element_blank(), axis.ticks=element_blank(), axis.text.y=element_text(size=5)) print(p2)