简体   繁体   English

如何在ggplot2中像这样调整y轴?

[英]How to adjust the the y axis like this in ggplot2?

Here is the codes and the present outplot这是代码和当前的情节

df <- data.frame(state = c('0','1'),
                                male = c(26287942,9134784),
                                female = c(16234000,4406645))
#output
> df
  state     male   female
1     0 26287942 16234000
2     1  9134784  4406645
library(ggplot2)
library(tidyr)

df_long <- pivot_longer(df, cols = c("female","male"))
names(df_long) <- c('state','sex','observations')
ggplot(data = df_long) +
  geom_col(aes(x = sex, y =observations, fill = state)) + 
   theme(legend.position = c(0.1,0.9),  
   legend.background = element_rect(fill='lightgrey') )

我现在的输出

I want to adjust the plots like this.我想调整这样的情节。 (I marked what I want to change.) (我标记了我想要更改的内容。) 所需图片

  1. Simplify the scientific records in y-axis.简化 y 轴上的科学记录。
  2. Count the ratio (the number of state 1)/(the number of state 0 + state 1) and plot like this.计算比率(状态 1 的数量)/(状态 0 + 状态 1 的数量)并像这样绘制。

It may be a little complicated, and I don't know which functions to use.可能有点复杂,不知道用什么函数。 If possible, can anyone tell me some related functions or examples?如果可能的话,谁能告诉我一些相关的功能或例子?

You can set options(scipen = 99) to disable scientific notation on y-axis.您可以设置options(scipen = 99)以禁用 y 轴上的科学记数法。 We can create a separate dataset for label data.我们可以为标签数据创建一个单独的数据集。

library(tidyverse)

options(scipen = 99)

long_data <- df %>% 
  pivot_longer(cols = c(male, female), 
               names_to = "sex", 
               values_to = "observations")

label_data <- long_data %>%
  group_by(sex) %>%
  summarise(perc = observations[match(1, state)]/sum(observations), 
            total = sum(observations), .groups = "drop")

ggplot(long_data) + 
  geom_col(aes(x = sex, y = observations, fill = state)) +
  geom_text(data = label_data, 
            aes(label = round(perc, 2), x = sex, y = total), 
            vjust = -0.5) + 
  theme(legend.position = c(0.1,0.9),  
        legend.background = element_rect(fill='lightgrey'))

在此处输入图像描述

["

By searching the Internet for about two days, I have finished the work!<\/i>通过在网上搜索了大约两天,我已经完成了工作!<\/b><\/p>

sex <- c('M','F')
y0 <- c(26287942,16234000)
y1 <- c(9134784, 4406645)
y0 <- y0*10^{-7}
y1 <- y1*10^{-7}
ratio <- y1/(y0+y1)
ratio <- round(ratio,2)
m <- t(matrix(c(y0,y1),ncol=2))
colnames(m) <- c(as.character(sex))
df <- as.data.frame(m)
df <- cbind(c('0','1'),df)
colnames(df)[1] <- 'observations'
df
df_long <- pivot_longer(df, cols = as.character(sex))
names(df_long) <- c('state','sex','observations')
df_r <- as.data.frame(df_long)            
df_r <- data.frame(df_r,ratio=rep(ratio,2))
ggplot(data = df_r) +
  geom_col(aes(x =sex, y = observations, fill = state))+
  theme(legend.position = c(0.1,0.9),
        legend.background = element_rect(fill=NULL) )+
  geom_line(aes(x=sex,y=ratio*10),group=1)+
  geom_point(aes(x=sex,y=ratio*10))+
  geom_text(aes(x=sex,y=ratio*10+0.35),label=rep(ratio,2))+
  scale_y_continuous(name =expression(paste('observations(','\u00D7', 10^7,')')),
                     sec.axis = sec_axis(~./10,name='ratio'))

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM