R、 ggplot,反转y轴并从底部绘制条形图
希望这是一个非常简单的问题,但我似乎找不到答案,尽管我已经检查了很多关于翻转y轴的答案 我有这样的数据:R、 ggplot,反转y轴并从底部绘制条形图,r,ggplot2,R,Ggplot2,希望这是一个非常简单的问题,但我似乎找不到答案,尽管我已经检查了很多关于翻转y轴的答案 我有这样的数据: df<-structure(list(applicant_name = structure(1:3, .Label = c("John Smith", "Lauren", "Billy"), class = "factor"), MeanRanking = c(11.5, 8.25, 20)), row
df<-structure(list(applicant_name = structure(1:3, .Label = c("John Smith",
"Lauren", "Billy"), class = "factor"), MeanRanking = c(11.5,
8.25, 20)), row.names = c(NA, -3L), class = c("tbl_df", "tbl",
"data.frame"))
df我认为geom\u col
不起作用,因为geom\u col
从0开始(或参见)。我们可以使用geom_段
,在进行一些数据操作后:
library(tidyverse)
df %>%
mutate(yy_max = max(MeanRanking)) %>%
mutate(yy_min = yy_max - MeanRanking) %>%
ggplot(aes(applicant_name, yy_min, yend = yy_max, xend = applicant_name))+
geom_segment(aes(colour = applicant_name), size = 3)+
scale_y_reverse()
我不相信geom\u col
会起作用,因为geom\u col
从0开始(或参见)。我们可以使用geom_段
,在进行一些数据操作后:
library(tidyverse)
df %>%
mutate(yy_max = max(MeanRanking)) %>%
mutate(yy_min = yy_max - MeanRanking) %>%
ggplot(aes(applicant_name, yy_min, yend = yy_max, xend = applicant_name))+
geom_segment(aes(colour = applicant_name), size = 3)+
scale_y_reverse()
也许这可以接近您想要的:
library(dplyr)
library(ggplot2)
library(tidyr)
#Code
df %>% mutate(Diff=abs(MeanRanking-max(MeanRanking))) %>%
pivot_longer(-applicant_name) %>%
mutate(value=-value,label=ifelse(name=='MeanRanking',abs(value),NA)) %>%
ggplot(aes(x=applicant_name,y=value,fill=interaction(applicant_name,name)))+
scale_y_continuous(labels = function(x) abs(x))+
geom_bar(stat = 'identity')+
geom_text(aes(label=label),vjust=-0.5,fontface='bold')+
scale_fill_manual(values = c('tomato','cyan3','magenta',
'transparent','transparent','transparent'))+
theme(legend.position = 'none')
输出:
也许这可以接近您想要的:
library(dplyr)
library(ggplot2)
library(tidyr)
#Code
df %>% mutate(Diff=abs(MeanRanking-max(MeanRanking))) %>%
pivot_longer(-applicant_name) %>%
mutate(value=-value,label=ifelse(name=='MeanRanking',abs(value),NA)) %>%
ggplot(aes(x=applicant_name,y=value,fill=interaction(applicant_name,name)))+
scale_y_continuous(labels = function(x) abs(x))+
geom_bar(stat = 'identity')+
geom_text(aes(label=label),vjust=-0.5,fontface='bold')+
scale_fill_manual(values = c('tomato','cyan3','magenta',
'transparent','transparent','transparent'))+
theme(legend.position = 'none')
输出:
如果您提供了一个简单的示例输入,可以用来测试和验证可能的解决方案,那么就更容易为您提供帮助。在ggplot中,条形图总是从零开始,您必须做大量的工作才能使情况并非如此。如果你不想从零开始,你想从什么数字开始?是否要硬编码值?你确定条形图是数据的最佳可视化吗?@MrFlick添加了一些数据并clarification@JoeCrozier你能用手画出来吗?输出应该是什么样子的?还有一个问题呢?谢谢你,只是这样。如果你提供了一个简单的示例输入,可以用来测试和验证可能的解决方案,那么帮助你会更容易。在ggplot中,条形图总是从零开始,您必须做大量的工作才能使情况并非如此。如果你不想从零开始,你想从什么数字开始?是否要硬编码值?你确定条形图是数据的最佳可视化吗?@MrFlick添加了一些数据并clarification@JoeCrozier你能用手画出来吗?输出应该是什么样子的?还有一个问题呢?谢谢你,这看起来不太对,因为劳伦现在有最小的酒吧,而比利的酒吧则接近顶部。但是,感谢您提供的所有信息。我建议您添加一张预期输出的图片,即使它只是一张草图。现在还不清楚你想要达到什么目标。这似乎不太正确,因为劳伦现在拥有最小的酒吧,而比利酒吧则接近顶端。但是,感谢您提供的所有信息。我建议您添加一张预期输出的图片,即使它只是一张草图。现在还不清楚你想要达到什么目标。这很有效,因此我接受了你的答案,但问题是:代码的某些方面使得“最低”分数的酒吧(在你的例子中,比利的分数是20)永远不会出现。我添加了其他一些虚假数据,将他的平均值提高到17.5,整个图表的比例发生了变化,17.5位于底部,他仍然没有一个横杆。我想在我的问题中,我确实说了“底部最大的数字”,这就回答了我的问题,但现在已经看到了,有没有办法总是将20固定在底部?@JoeCrozier在scale\u y_continuous()
中有一个选项,名为limits
。用limits=c(NA,20)
或limits=c(NA,-20)
来解决这个问题,这样我就接受了你的答案,但问题是:代码的某些方面使得“最低”分数的酒吧(在你的例子中,比利的分数是20)永远不会出现。我添加了其他一些虚假数据,将他的平均值提高到17.5,整个图表的比例发生了变化,17.5位于底部,他仍然没有一个横杆。我想在我的问题中,我确实说了“底部最大的数字”,这就回答了我的问题,但现在已经看到了,有没有办法总是将20固定在底部?@JoeCrozier在scale\u y_continuous()
中有一个选项,名为limits
。用limits=c(NA,20)
或limits=c(NA,-20)