Ggplot2 Okrągły Heatmap który wygląda jak pączek

Próbuję stworzyć circular heatmap z ggplot2, aby móc używać większej liczby etykiet wokół obwodu koła. Chciałbym, aby wyglądało to bardziej jak pączek z pustą dziurą w środku, ale jednocześnie nie tracąc żadnych wierszy (trzeba by je skompresować). Jakieś pomysły? Kod na to, co mam jest poniżej. Dzięki!

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) 
Author: user1905004, 2012-12-15

2 answers

Oto rozwiązanie realizowane przez (1) konwersję współczynnika na liczbę i dodanie offsetu, (2) ręczne określanie granic y i (3) ręczne ustawianie podziałów i etykiet osi 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)

Tutaj wpisz opis obrazka

 44
Author: bdemarest,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-12-15 02:46:11

Zwracając się do komentarza @ FedericoGiorgi, a nie do pierwotnego pytania. Dzięki @bdemarest Twoje rozwiązanie jest niezwykle przydatne!

Zhakuj ramkę danych, aby wyświetlić etykiety, ułóż je ładnie:

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)]

Dodaj geom_text dla etykiet:

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)

Tutaj wpisz opis obrazka

 3
Author: fanli,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-04-11 16:49:32