需要帮助改善此 GIF 外观,同时它在闪亮的内部运行 [英] Need help improving this GIF appearance while it runs inside shiny

查看:15
本文介绍了需要帮助改善此 GIF 外观,同时它在闪亮的内部运行的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试在我闪亮的应用程序中运行 GIF.我在技术上使用此代码生成 GIF 并从我的计算机在 APP 中手动上传.我的部分数据集如下所示,我想要做的是运行一个 GIF,显示 1960 年至 2015 年的前 10 部电影.

I'm trying to run a GIF inside my shiny App. I'm technically using this code to generate a GIF and upload it manually from my computer inside the APP. Part of my dataset is shown below, what I'm trying to do is run a GIF that shows the top 10 movies from 1960 - 2015.

这是我的 GIF 的链接.https://media.giphy.com/media/U4eSLRaDbGpjqU0V42/giphy.gif

this is the link to my GIF. https://media.giphy.com/media/U4eSLRaDbGpjqU0V42/giphy.gif

这是我的应用程序图片 - (https://imgur.com/3Ddao5S)我需要解决 4 个问题.

This is my a picture of my App - (https://imgur.com/3Ddao5S) I need to address 4 problems.

1 - 首先,当我在我的 Shiny 选项卡上运行这个时,其中一些电影名称被剪裁得很好,你不能完全减少它们.如何确定其方向?

2 - 我希望最后的收入显示为 1M 或 3M 或 300M,而不是 2554489,绝对不像 1e+ 554 等有没有办法像这样设置X轴?

3 - 网格线很难看 AF 我该如何移除它们?

4 - 放慢速度,如何?

是的,我知道我的应用程序没有直接渲染 GIF,我花了几个星期都做不到,里面创建的 GIF 不起作用.

Yes, I know my App is not directly rendering the GIF, I spent weeks couldn't do it GIF created inside just doesn't work.

ui <- fluidPage(theme = shinytheme("cerulean"),
                titlePanel(p(strong("Movie browser, 1960 - 2014", windowTitle = "Movies"))),   

                # Sidebar layout with a input and output definitions
                sidebarLayout(
mainPanel(
                    tabsetPanel(
                     tabPanel(h4(p(strong("GIF"))), tags$img(src = "outfile.GIF"))                  
                  )
                )
)

structure(list(id = c(135397L, 135397L, 76341L, 76341L, 262500L, 
140607L, 140607L, 140607L, 168259L, 168259L), budget = c(150000000L, 
150000000L, 150000000L, 150000000L, 110000000L, 200000000L, 200000000L, 
200000000L, 190000000L, 190000000L), revenue = c(1513528810, 
1513528810, 378436354, 378436354, 295238201, 2068178225, 2068178225, 
2068178225, 1506249360, 1506249360), title = structure(c(3L, 
3L, 4L, 4L, 2L, 5L, 5L, 5L, 1L, 1L), .Label = c("Furious 7", 
"Insurgent", "Jurassic World", "Mad Max: Fury Road", "Star Wars: The Force Awakens"
), class = "factor"), homepage = structure(c(2L, 2L, 3L, 3L, 
5L, 4L, 4L, 4L, 1L, 1L), .Label = c("http://www.furious7.com/", 
"http://www.jurassicworld.com/", "http://www.madmaxmovie.com/", 
"http://www.starwars.com/films/star-wars-episode-vii", "http://www.thedivergentseries.movie/#insurgent"
), class = "factor"), director = structure(c(1L, 1L, 2L, 2L, 
5L, 3L, 3L, 3L, 4L, 4L), .Label = c("Colin Trevorrow", "George Miller", 
"J.J. Abrams", "James Wan", "Robert Schwentke"), class = "factor"), 
    runtime = c(124L, 124L, 120L, 120L, 119L, 136L, 136L, 136L, 
    137L, 137L), vote_average = c(6.5, 6.5, 7.1, 7.1, 6.3, 7.5, 
    7.5, 7.5, 7.3, 7.3), release_year = c(2015L, 2015L, 2015L, 
    2015L, 2015L, 2015L, 2015L, 2015L, 2015L, 2015L), genre = structure(c(1L, 
    2L, 1L, 2L, 2L, 1L, 2L, 4L, 1L, 3L), .Label = c("Action", 
    "Adventure", "Crime", "Fantasy"), class = "factor"), breakeven = c(1363528810, 
    1363528810, 228436354, 228436354, 185238201, 1868178225, 
    1868178225, 1868178225, 1316249360, 1316249360), AerageVotesCat = structure(c(2L, 
    2L, 2L, 2L, 2L, 1L, 1L, 1L, 1L, 1L), .Label = c("Excellent", 
    "Good"), class = "factor")), row.names = c(NA, 10L), class = "data.frame")

UI:
# library(gifski)
library(ggplot2)
library(gganimate)
library(dplyr)
library(scales)
library(shiny)



  output$plot2 <- renderImage({
    df2 <- df1 %>%
      group_by(release_year) %>%
      # The * 1 makes it possible to have non-integer ranks while sliding
      mutate(rank = rank(-revenue),
             Value_rel = revenue/revenue[rank==1],
             Value_lbl = paste0(" ",round(revenue))) %>%
      group_by(title) %>% 
      filter(rank <=10) %>%
      ungroup()
    staticplot = ggplot(df2, aes(rank, group = title, 
                                           fill = as.factor(title), color = as.factor(title))) +
      geom_tile(aes(y = revenue/2,
                    height = revenue,
                    width = 0.9), alpha = 0.8, color = NA) +
      geom_text(aes(y = 0, label = paste(title, " ")), vjust = 0.2, hjust = 1) +
      geom_text(aes(y=revenue,label = Value_lbl, hjust=0)) +
      coord_flip(clip = "off", expand = FALSE) +
      scale_y_continuous(labels = scales::comma) +
      scale_x_reverse() +
      guides(color = FALSE, fill = FALSE) +
      theme(axis.line=element_blank(),
            axis.text.x=element_blank(),
            axis.text.y=element_blank(),
            axis.ticks=element_blank(),
            axis.title.x=element_blank(),
            axis.title.y=element_blank(),
            legend.position="none",
            panel.background=element_blank(),
            panel.border=element_blank(),
            panel.grid.major=element_blank(),
            panel.grid.minor=element_blank(),
            panel.grid.major.x = element_line( size=.1, color="grey" ),
            panel.grid.minor.x = element_line( size=.1, color="grey" ),
            plot.title=element_text(size=25, hjust=0.5, face="bold", colour="grey", vjust=-1),
            plot.subtitle=element_text(size=18, hjust=0.5, face="italic", color="grey"),
            plot.caption =element_text(size=8, hjust=0.5, face="italic", color="grey"),
            plot.background=element_blank(),
            plot.margin = margin(2,2, 2, 4, "cm"))

    anim = staticplot + transition_states(release_year, transition_length = 4, state_length = 1) +
      view_follow(fixed_x = TRUE)  +
      labs(title = 'Revenue ($) per Year for the top 10 movies : {closest_state}',  
           subtitle  =  "Top 10 Movies",
           caption  = "Revenue in USD | Data Source: Kaggle")
    anim_save("outfile.gif",animate(anim, 200, fps = 4,  width = 800, height = 900))
  })

    }
  )

}


# Create the Shiny app object
shinyApp(ui = ui, server = server)

推荐答案

我不知道您所有问题的答案,但请查看下面的自我维持代码:

I do not know answers to all of your questions, but please have a look at the self-sustainable code below:

library(ggplot2)
library(reshape2)
library(scales)

example_df <- data.frame(movie=c("A", "B", "C", "D"), 
                         revenue=c(3354823, 1284690, 8513581, 4699102))
x_cols <- scales::hue_pal()(length(levels(example_df$movie)))
names(x_cols) <- levels(example_df$movie)

ggplot(data=example_df) + geom_bar(aes(x=movie, y=revenue, fill=movie), stat="identity") +
  scale_y_continuous(labels = dollar_format(scale=10^-6, suffix="M")) +
  theme_bw() +
  theme(axis.text.x = element_text(angle=45, 
                                   colour=x_cols[substr(levels(example_df$movie),1,1)]),
        panel.grid = element_blank())

我首先要声明的是,如果不使用 geom_bar,您可能会使事情变得过于复杂.它是专门为处理您想要显示的数据类型而设计的.因此,坚持下去是有利可图的.如果您想使用与条形本身相同的颜色为条形图的标签着色,您可以按照此处显示的技巧进行操作:按组划分颜色轴标签,我无耻地将其应用到我的示例中.

I would start with the statement that you may be over-complicating things not using geom_bar. It was designed precisely to handle the kind of data you want to show. Thus it would be profitable to stick with it. If you want to colour the labels of a bar plot with the same colours as bars themselves you could follow the trick shown here: Color axis labels by group, which I shamelessly applied to my example.

广告.1.这是重现最棘手的部分,原因可能很多.避免这种情况的一种可靠方法是使用 element_text 函数的 angle 参数稍微旋转名称.只要您使用条形图,这就会起作用.

Ad. 1. This is the most tricky part to reproduce, and the reasons can be plenty. One sure way to circumvent that is to rotate names slightly, using angle parameter of the element_text function. This will work as long as you resort back to a bar plot.

广告.2.使用很棒的 scales 库.dollar_format 是您要查找的函数(尽管名称很混乱).

Ad. 2. Use the great scales library. dollar_format is the function you look for (although the name is pretty confusing).

广告.3.panel.gridtheme 函数中.

Ad. 3. panel.grid in the theme function.

这篇关于需要帮助改善此 GIF 外观,同时它在闪亮的内部运行的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆