如何在GGPLOT中使用2个分类和数值变量构建条形图?

发布于 2025-01-25 21:58:18 字数 703 浏览 3 评论 0原文

我有2个分类变量和2个数值列的数据框,代表百分比的负和积极变化。我有一项非常具体的任务,并难以通过GGPLOT做到这一点。 我想在y轴上绘制模型和来源,以及相应的正和负更改条(不是镜子图,分别是镜子图),颜色需要由模型来定义

df <- data.frame (Origin = c("Canada", "Canada","Canada", "Canada","Canada", "Canada","USA","USA","USA","USA","USA","USA"),
                  Model = c("A","B","C","D","E","F","A","B","C","D","E","F"),
                  poschange = c(60, 45,34,56, 65, 44,40, 55, 35, 24,34,12),
                  negchange = c(-5,-2,-0.5,-2,-1,-0.05,-1,-3,-0.1,-3,-1.5,-0.9))

类似的样本,但不是镜子图,我希望它们在下面一个,单独

I have dataframe with 2 categorical variable and 2 numerical columns, which represents negative and positive changes in percentage. I have a very specific task and struggle to do that via ggplot.
I want to plot Model and Origin on y-axis and corresponding positive and negative changes bars (not mirror plot, separately), colours need to be defined by the models

df <- data.frame (Origin = c("Canada", "Canada","Canada", "Canada","Canada", "Canada","USA","USA","USA","USA","USA","USA"),
                  Model = c("A","B","C","D","E","F","A","B","C","D","E","F"),
                  poschange = c(60, 45,34,56, 65, 44,40, 55, 35, 24,34,12),
                  negchange = c(-5,-2,-0.5,-2,-1,-0.05,-1,-3,-0.1,-3,-1.5,-0.9))

something like this sample, but not a mirror chart, I want them one below one, separately
enter image description here

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

打小就很酷 2025-02-01 21:58:18

在y轴上,显示Origin模型。条通过poschange对条进行排序。

require(dplyr)
require(ggplot2)
require(tidyr)
df <- data.frame (Origin = c("Canada", "Canada","Canada", "Canada","Canada", "Canada","USA","USA","USA","USA","USA","USA"),
                  Model = c("A","B","C","D","E","F","A","B","C","D","E","F"),
                  poschange = c(60, 45,34,56, 65, 44,40, 55, 35, 24,34,12),
                  negchange = c(-5,-2,-0.5,-2,-1,-0.05,-1,-3,-0.1,-3,-1.5,-0.9))
df2 <- df %>% pivot_longer(., cols=c('poschange','negchange'),
                    names_to = 'value_category')
df2 <- df2 %>% mutate(Groups = paste(Origin, Model))
df2 <- df2 %>% mutate(label_position=ifelse(value>0, value-5,value-8)) # adjusting label position
df2 %>% arrange(value) %>% ggplot(aes(x=reorder(Groups,value), y=value, 
                                      fill=value_category, 
                                      group=value_category))+
  geom_col(width=0.75)+ # or geom_bar(stat='identity')
  coord_flip()+
  scale_y_continuous(limits = c(-100,100),
    breaks=seq(-100,100,20),
                     labels=abs(seq(-100,100,20)))+
  geom_text(aes(label=value,y=label_position),)+
  labs(x='Value',)+
  theme_minimal() +
  theme(legend.position='bottom',
        panel.grid=element_line(color='white'),
        axis.text.x = element_blank(),
        axis.title=element_blank(),
        legend.title = element_blank())+
  scale_fill_brewer(palette = 'Set1')

“”

reprex软件包(v2.0.1)

On Y axis, Origin and Model are displayed. Bars are sorted by poschange.

require(dplyr)
require(ggplot2)
require(tidyr)
df <- data.frame (Origin = c("Canada", "Canada","Canada", "Canada","Canada", "Canada","USA","USA","USA","USA","USA","USA"),
                  Model = c("A","B","C","D","E","F","A","B","C","D","E","F"),
                  poschange = c(60, 45,34,56, 65, 44,40, 55, 35, 24,34,12),
                  negchange = c(-5,-2,-0.5,-2,-1,-0.05,-1,-3,-0.1,-3,-1.5,-0.9))
df2 <- df %>% pivot_longer(., cols=c('poschange','negchange'),
                    names_to = 'value_category')
df2 <- df2 %>% mutate(Groups = paste(Origin, Model))
df2 <- df2 %>% mutate(label_position=ifelse(value>0, value-5,value-8)) # adjusting label position
df2 %>% arrange(value) %>% ggplot(aes(x=reorder(Groups,value), y=value, 
                                      fill=value_category, 
                                      group=value_category))+
  geom_col(width=0.75)+ # or geom_bar(stat='identity')
  coord_flip()+
  scale_y_continuous(limits = c(-100,100),
    breaks=seq(-100,100,20),
                     labels=abs(seq(-100,100,20)))+
  geom_text(aes(label=value,y=label_position),)+
  labs(x='Value',)+
  theme_minimal() +
  theme(legend.position='bottom',
        panel.grid=element_line(color='white'),
        axis.text.x = element_blank(),
        axis.title=element_blank(),
        legend.title = element_blank())+
  scale_fill_brewer(palette = 'Set1')

Created on 2022-05-03 by the reprex package (v2.0.1)

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文