Метки оси X неправильно выровнены в R-образной полосе - PullRequest
0 голосов
/ 28 января 2019

У меня есть данные data.table для создания диаграмм с накоплением и с группировкой с использованием приведенного ниже кода:

causesDf <- causesDf[, c('Type', 'Gender', 'Total')]
causesSort <- causesDf[, lapply(.SD, sum), 
                       by=list(causesDf$Type, causesDf$Gender)]

и данные будут выглядеть примерно так:

                           causesDf causesDf.1  Total

 1:                        Illness (Aids/STD)     Female   2892
 2:                 Change in Economic Status     Female   4235
 3:   Cancellation/Non-Settlement of Marriage     Female   6126       
 4:                           Family Problems     Female 133181
 5:                        Illness (Aids/STD)       Male   5831
 6:                 Change in Economic Status       Male  31175
 7:    Cancellation/Non-Settlement of Marriage       Male   5170

и так далее..

Я пытаюсь создать барплот, как показано ниже:

barpos <- barplot(sort(causesSort$Total, decreasing=TRUE),
                  col=c("red","green"), xlab="", ylab="", 
                  horiz=FALSE, las=2)

legend("topright", c("Male","Female"), fill=c("red","green"))

end_point <- 0.2 + nrow(causesSort) + nrow(causesSort) - 0.1

text(seq(0.1, end_point, by=1), par("usr")[3] - 30,
     srt=60, adj= 1, xpd=TRUE,
     labels=paste(causesSort$causesDf), cex=0.65)

, но X-метки выровнены неправильно, я что-то пропустил?

enter image description here

Ожидаемый результат, как:

enter image description here

Отредактировано:

reasonSort

structure(list(causesDf = c("Illness (Aids/STD)", "Change in Economic Status", 
"Cancellation/Non-Settlement of Marriage", "Physical Abuse (Rape/Incest Etc.)", 
"Dowry Dispute", "Family Problems", "Ideological Causes/Hero Worshipping", 
"Other Prolonged Illness", "Property Dispute", "Fall in Social Reputation", 
"Illegitimate Pregnancy", "Failure in Examination", "Insanity/Mental Illness", 
"Love Affairs", "Professional/Career Problem", "Divorce", "Drug Abuse/Addiction", 
"Not having Children(Barrenness/Impotency", "Causes Not known", 
"Unemployment", "Poverty", "Death of Dear Person", "Cancer", 
"Suspected/Illicit Relation", "Paralysis", "Property Dispute", 
"Unemployment", "Poverty", "Family Problems", "Illness (Aids/STD)", 
"Drug Abuse/Addiction", "Other Prolonged Illness", "Death of Dear Person", 
"Causes Not known", "Cancer", "Not having Children(Barrenness/Impotency", 
"Cancellation/Non-Settlement of Marriage", "Paralysis", "Physical Abuse (Rape/Incest Etc.)", 
"Professional/Career Problem", "Love Affairs", "Fall in Social Reputation", 
"Dowry Dispute", "Ideological Causes/Hero Worshipping", "Illegitimate Pregnancy", 
"Failure in Examination", "Change in Economic Status", "Insanity/Mental Illness", 
"Divorce", "Suspected/Illicit Relation", "Not having Children (Barrenness/Impotency", 
"Not having Children (Barrenness/Impotency"), causesDf.1 = c("Female", 
"Female", "Female", "Female", "Female", "Female", "Female", "Female", 
"Female", "Female", "Female", "Female", "Female", "Female", "Female", 
"Female", "Female", "Female", "Female", "Female", "Female", "Female", 
"Female", "Female", "Female", "Male", "Male", "Male", "Male", 
"Male", "Male", "Male", "Male", "Male", "Male", "Male", "Male", 
"Male", "Male", "Male", "Male", "Male", "Male", "Male", "Male", 
"Male", "Male", "Male", "Male", "Male", "Female", "Male"), Total = c(2892, 
4235, 6126, 2662, 31206, 133181, 776, 69072, 4601, 4697, 2391, 
12054, 33352, 21339, 1596, 2535, 1205, 5523, 148134, 3748, 7905, 
4707, 2878, 8093, 2284, 14051, 23617, 24779, 208771, 5831, 28841, 
125493, 5614, 304985, 6180, 2299, 5170, 5002, 1330, 10958, 23700, 
8767, 764, 1342, 103, 14951, 31175, 60877, 1598, 6818, 544, 222
)), row.names = c(NA, -52L), class = c("data.table", "data.frame"
)
# , .internal.selfref = <pointer: 0x00000000098d1ef0>  # seems not to work
)

Ответы [ 2 ]

0 голосов
/ 28 января 2019

Вот решение ggplot2.Это может обеспечить лучший контроль над конечным результатом

library(dplyr)
library(ggplot2)

#Rename columns names
names(causesDf) <- c('Type', 'Gender', 'Total')

#sort male before females
causesDf$Gender<-factor(causesDf$Gender, levels=c("Male", "Female"), ordered=TRUE)

#sort types by total sum and sort in decreasing order
sorted<-causesDf %>% group_by(Type) %>% summarize(gtotal=sum(Total)) %>% arrange(desc(gtotal))
causesDf$Type<-factor(causesDf$Type, levels=sorted$Type, ordered=TRUE)


#plot graph
g<-ggplot(causesDf, aes(x=Type, y=Total, group=Gender, fill=Gender)) + 
  geom_col(position = "dodge") +
  theme(axis.text.x = element_text(angle = 45, hjust=1)) +
  scale_fill_manual(values = alpha(c("blue", "green"), .5))
print(g)

enter image description here

0 голосов
/ 28 января 2019

Если вы не полагаетесь на поворот на 45 ° (это немного сложнее), вы можете использовать это решение.

Сначала нам нужно изменить данные по полу.

library(reshape2)
df2 <- dcast(causesSort, ... ~ causesDf.1 , value.var="Total")

Затем мы генерируем имена строк из столбца type и удаляем этот столбец.

rownames(df2) <- df2[, 1]
df2 <- df2[, -1]

Затем мы упорядочиваем данные по одному столбцу, например, по Female.

df2 <- df2[order(-df2$Female), ]

Метки - это имена строк.

# labs <- rownames(df2) 

Однако, поскольку они очень длинные (и вредны для глаз читателя!), Нам, возможно, придется подумать о более коротких.Обходной путь - это немного их укоротить.

labs <- substr(sapply(strsplit(rownames(df2), " "), 
                      function(x) x[1]), 1, 8)

Теперь мы можем применить barplot().

pos <- barplot(t(df2), beside=TRUE, xaxt="n",
               col=c("#3C6688", "#45A778"), border="white")

pos дает нам матрицу позиций баров, потому что мыиметь сгруппированный сюжет нам нужен столбец означает.Мы можем использовать его для построения оси.

axis(1, colMeans(pos), labs, las=2)

Результат enter image description here

...