专栏首页生信小驿站如何自定义Y轴间隔(制作类似fox news的线图)

如何自定义Y轴间隔(制作类似fox news的线图)

最近这张图片在社交媒体上火爆。乍一看可能并没有什么特殊的地方,但随后会注意到Y轴。Y轴上的标度在间距相等,但标度分布却并不均匀,有时代表30人,有时代表10人,有时甚至代表50人。这次我们可以通过代码绘制同样的图片。

library(tidyverse)
library(scales)

fox_data <- tibble(
  cases = c(33, 61, 86, 112, 116, 129, 192, 174, 
            344, 304, 327, 246, 320, 339, 376),
  day = as.Date("2020-03-18") + 0:14)

foxcol <- "#0c244a"
foxfont <- "Montserrat"

p <- ggplot(fox_data, aes(x = day, y = cases, label = cases)) +
  geom_line(size = 3, colour = "white") +
  geom_point(size = 10, colour = "white", shape = 19) +
  geom_point(size = 10, colour = "black", shape = 1) +
  geom_text(size = 3.5, fontface = 'bold', family = foxfont) +
  theme_dark(base_family = foxfont, base_size = 10) +
  theme(panel.grid.major.x = element_blank(),
        panel.grid.minor.x = element_blank(),
        panel.grid.major.y = element_line(colour = "grey50"),
        panel.grid.minor.y = element_blank(),
        panel.background = element_rect(fill = foxcol),
        plot.background = element_rect(fill = foxcol),
        text = element_text(colour = "white"),
        axis.text = element_text(colour = "white"),
        plot.title = element_text(hjust = 0.5, size = 20),
        plot.caption = element_text(colour = "grey50")) +
  scale_x_date(breaks = fox_data$day, labels = format(fox_data$day, "%B\n%d")) +
  labs(x = "",
       y = "",
       title = "New Cases Per Day")

p + labs(caption = "Standard scaling (or non-scaling) of vertical axis")













crazyfox_trans <- function(){
  scales::trans_new("crazyfox",
                    transform = function(y){
                      yt <- case_when(
                        y <= 90 ~ y / 30,
                        y <= 100 ~ 3 + (y - 90) / 10,
                        y <= 190 ~ 4 + (y - 100) / 30,
                        y <= 240 ~ 7 + (y - 190) / 50,
                        y <= 250 ~ 8 + (y - 240) / 10,
                        TRUE ~ 9 + (y - 250) / 50
                      )
                      return(yt)
                    },
                    inverse = function(yt){
                      y <- case_when(
                        yt <= 3 ~  yt * 30,
                        yt <= 4 ~ 90 + (yt - 3) * 10,
                        yt <= 7 ~ 100 + (yt - 4) * 30,
                        yt <= 8 ~ 190 + (yt - 7) * 50,
                        yt <= 9 ~ 240 + (yt - 8) * 10,
                        TRUE ~ 250 + (yt - 9) * 50
                      )
                      return(y)
                    }
  )
}



p + 
  scale_y_continuous(trans = crazyfox_trans(), 
                     breaks = c(30,60,90,100,130,160,190,240,250,300, 350,400,450))  + 
  labs(caption = "Matching the eccentric scale transformation in a Fox News graphic of 4 April,
       with Fox's axis breaks")

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • R 热图绘制heatmap①

    用户1359560
  • R语言之可视化(32)之ggtext:提高ggplot2的文本呈现

    该ggtext软件包为ggplot2 提供了富文本(基本HTML和Markdown)支持。 富文本可用于图注解(图标题,字幕,标题,轴标签,图例等)中并可视化文...

    用户1359560
  • Python数据处理从零开始----第四章(可视化)(15)制作签名

    通过简单的代码我们就可以达到下面的效果,成功的将拍摄的签名转化为电子版本的手写签名。

    用户1359560
  • 用R语言复盘美国总统大选结果~

    这两天各种社交媒体都被美国大选的消息刷屏,各种段子满天飞,把平时不怎么关注政治的小编都吸引了。 美国大选的投票数据,给小编的写作提供了非常宝贵的案例数据,毕竟四...

    数据小磨坊
  • python selenium 元素定位

    left = element.location['x'] top = element.location['y'] right = element.locat...

    用户5760343
  • 百亿美元订单不要了 谷歌退出美国防部云计算竞标

    10月9日消息,据彭博社报道,Alphabet旗下搜索子公司谷歌已决定不再参与美国国防部价值高达100亿美元的云计算项目合同,称该项目可能与其公司价值观不相符。

    静一
  • 为什么Selenium点不到元素

    最近做了许多登陆项目,我会优先选择使用requests来模拟请求,但是有些参数实在是很难获取,这个时候我会使用Selenium,也还是遇到了各种坑,也算是见识到...

    小歪
  • R语言可视化——图表嵌套(母子图)

    之前在学习ggplot的时候,一直存在着一个困惑。 就是这个函数是否允许两个做出来的两个相关图表重叠嵌套(也就是在一个大图(主图)的边缘位置,放置另一个缩小版的...

    数据小磨坊
  • 浅析ReDoS的原理与实践

    *本文原创作者:MyKings,本文属FreeBuf原创奖励计划,未经许可禁止转载 ReDoS(Regular expression Denial of Ser...

    FB客服
  • 【TypeScript 演化史 — 第九章】object 类型 和 字符串索引签名类型的点属性

    TypeScript 2.2 引入了一个新的 object 类型。它表示任何非基本类型。以下是 JS 的基本类型:

    Javanx

扫码关注云+社区

领取腾讯云代金券