Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typo3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R、 ggplot,反转y轴并从底部绘制条形图_R_Ggplot2 - Fatal编程技术网

R、 ggplot,反转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

希望这是一个非常简单的问题,但我似乎找不到答案,尽管我已经检查了很多关于翻转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.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)