草庐IT

2022-11-28-大数据可视化“可视化国产/进口电影票房榜单”分析,特征维度大于50

汤姆z 2024-03-26 原文

可视化国产/进口电影票房榜单



前言

党的十八大以来,国产电影产业与事业快速发展,创作水平不断提高,题材类型丰富多元,受众口碑不断提升,在市场竞争中表现愈发突出,已成为广大人民群众首选的文化消费形式。国产电影的高质量发展,有着多重的表现。
  首先是主旋律电影的复苏。既往,主旋律似乎和院线电影难以相容,取得商业成功的主旋律电影少之又少,而一些商业电影的价值取向也似乎与主旋律貌合神离。近年来,随着国内电影工业水平不断提升,电影作品对主旋律的表达方式也更为细腻深入,观众对主旋律影片的认可度逐渐提高。诸如2016年的《湄公河行动》、2018年的《红海行动》、2019年的《我和我的祖国》、2020年的《八佰》《我和我的家乡》、2021年的《长津湖》《中国医生》等影片,充分吸纳了类型片的叙事手段,凭借其精良的制作与深厚的情怀,在票房、口碑上实现了双丰收,《长津湖》更是打破了影史票房纪录,创造了中国电影的奇迹。
  其次是商业电影的繁盛。过去的十年是中国电影扩展市场,开疆拓土的十年。2012年以来,电影市场保持着高速增长的态势,2012年全国银幕数有13118块,到2021年达到了82248块,基本覆盖了全国的城市与城镇;2019年全国总票房达到了642亿元,其后由于疫情影响票房总量有一定程度下降,但也超越北美成为世界第一。从2012年《人再囧途之泰囧》拿下12亿票房成为首部超十亿票房国产电影并获得当年票房冠军之后,国产电影开始频频打破票房纪录,在好莱坞电影的冲击下茁壮成长,让引进片称霸票房榜的时代成为了过去式。2015年,《捉妖记》取得24亿票房;2016年,《美人鱼》取得33亿票房;2017年,《战狼2》取得56亿票房;再到《长津湖》的57亿票房,国产电影票房冠军几经易手,人们对国产电影的信心也与日俱增。在此期间,也出现了《心花路放》《夏洛特烦恼》《流浪地球》《你好,李焕英》《唐人街探案》系列等商业表现优秀的电影作品,国产电影的市场一路向好。
为了进一步将国产电影和进口电影的票房进行一个更好地对比,此次选题用大数据可视化的方式直观的将数据展示出来,可视化主要使用 pyecharts >= 1.9。


数据分析

数据集概况

数据集分为四个文件,分别是电影票房表现概览、票房榜、电影票房三十日时段趋势数据和电影票房三十日时段详情。

数据维度:

电影票房表现概览维度31,数据量100:



票房榜维度8,数据量150
电影票房三十日时段趋势数据维度16,数据量4620

电影票房三十日时段详情数据维度15,数据量3392


数据可视化过程

引包

import numpy as np
import pandas as pd
from collections import Counter
from pyecharts import options as opts
from pyecharts.charts import *
from pyecharts.commons.utils import JsCode
from pyecharts.globals import ThemeType
from pyecharts.components import Table
from pyecharts.options import ComponentTitleOpts
import datetime

票房榜数据概览

data = pd.read_excel(r"/home/mw/input/movie7110/票房榜.xlsx")
data.head(1)

票房榜数据字段处理

data["年份"] = data["上映日期"].apply(lambda x: str(x.split("-")[0]))
data["票房"] = data["票房"].apply(lambda x: round(x/100000000, 2))
data = data.rename(columns={"票房":"票房/亿"})
data.head(1)

电影票房表现数据概览

data_haed = pd.read_excel(r"/home/mw/input/movie7110/电影票房表现概览.xlsx")
data_haed.head(1)

电影票房数据字段处理

data_haed_all = data.merge(data_haed, how="left", on=['EnMovieID'])
data_haed_all["首映票房"] = data_haed_all["首映票房"].apply(lambda x: round(x/100000000, 2))
data_haed_all["首周票房"] = data_haed_all["首周票房"].apply(lambda x: round(x/100000000, 2))
data_haed_all["首周末票房"] = data_haed_all["首周末票房"].apply(lambda x: round(x/100000000, 2))
data_haed_all = data_haed_all.rename(columns={"电影_x": "电影", "首映票房": "首映票房/亿", "首周票房": "首周票房/亿", "首周末票房": "首周末票房/亿"})
data_haed_all.info()
data_haed_all = data_haed_all.drop(labels=["EnMovieID","DBOMovieID","EFMTMovieID","电影_y","GenreMainID"],axis=1)
colums = list(data_haed_all)
print(colums)
data_all = data_haed_all[data_haed_all["榜单类别"] == "全部"]
data_china = data_haed_all[data_haed_all["榜单类别"] == "国产"]
data_foreign = data_haed_all[data_haed_all["榜单类别"] == "进口"]

data_cat = [data_all, data_china, data_foreign]
cat = ["全部", "国产","进口"]

榜单类别 - 国产/进口 - TOP50

tab = Tab()

headers = colums

rows_china = data_china[colums].apply(lambda x: list(x), axis=1).values.tolist()

rows_foreign = data_foreign[colums].apply(lambda x: list(x), axis=1).values.tolist()

attributes = {"class": "fl-table", "style": "margin: 0 auto"}  # 居中显示

table_china = Table()
attributes = {"class": "fl-table", "style": "margin: 0 auto"}  # 居中显示
table_china.add(headers, rows_china, attributes)
table_china.set_global_opts(
    title_opts=ComponentTitleOpts(title=f"榜单类别 - 国产 - TOP50", subtitle="")
)

table_foreign = Table()
attributes = {"class": "fl-table", "style": "margin: 0 auto"}  # 居中显示
table_foreign.add(headers, rows_foreign, attributes)
table_foreign.set_global_opts(
    title_opts=ComponentTitleOpts(title=f"榜单类别 - 进口 - TOP50", subtitle="")
)

table = Table()
table.add([], [], attributes)
table.set_global_opts(
    title_opts=ComponentTitleOpts(title="键盘左右键移动视图查看", subtitle="")
)

tab.add(table_china, "国产")
tab.add(table_foreign, "进口")
tab.add(table, "点击预览")

tab.render_notebook()

电影票房榜单 - TOP50

line_max = max(max(data_all['场均人次'].tolist()), max(data_all['平均票价'].tolist()))

bar_max = max(data_all['票房/亿'].tolist())

bar_all = (
    Bar(init_opts=opts.InitOpts(width="1000px", height="600px",theme='light'))  # 设置图表大小
        .add_xaxis(xaxis_data=data_all['电影'].tolist())  # x轴
        .add_yaxis(
        series_name="票房/亿",  # 柱形图系列名称
        y_axis=data_all['票房/亿'].tolist(),  # 数据
        label_opts=opts.LabelOpts(is_show=False, position='top', formatter="{c}/亿"),  # 显示数据标签
        itemstyle_opts={
            "normal": {
                "color": JsCode("""new echarts.graphic.LinearGradient(0, 0, 0, 1, [{
                    offset: 0,
                    color: '#ee3f4d'
                }, {
                    offset: 1,
                    color: '#eea2a4'
                }], false)""", ),
                "opacity": 0.8,
#                 "barBorderRadius": [20, 20, 0, 0],
                'shadowBlur': 8,
                'shadowColor': 'rgba(0, 0, 0, 0.4)',
                'shadowOffsetX': 10,
                'shadowOffsetY': 10,
                'borderColor': 'rgb(220,220,220)',
                'borderWidth': 1
            }}
    )
        .extend_axis(  # 设置次坐标轴
        yaxis=opts.AxisOpts(
            name="",  # 次坐标轴名称
            type_="value",  # 次坐标手类型
            min_=-2 * line_max,  # 最小值
            max_=2 * line_max,  # 最大值
            is_show=False,  # 是否显示
            axisline_opts=opts.AxisLineOpts(is_show=False,  # y轴线不显示
                                            linestyle_opts=opts.LineStyleOpts(color='#2486b9')),  # 设置线颜色, 字体颜色也变
            axistick_opts=opts.AxisTickOpts(is_show=False),  # 刻度线不显示
            axislabel_opts=opts.LabelOpts(formatter="{value}"),  # 次坐标轴数据显示格式
        )
    )

        .set_global_opts(title_opts=opts.TitleOpts(title="电影票房 - top50",  # 标题
                                                   title_textstyle_opts=opts.TextStyleOpts(font_size=20),  # 主标题字体大小
                                                   subtitle="国产/进口",  # 次坐标轴
                                                   pos_left='center',
                                                   pos_top='0.8%'),  # 标题位置
                         legend_opts=opts.LegendOpts(is_show=True,
                                                     pos_top=50,
                                                     orient="horizontal",
                                                     ),  # 不显示图例
                         tooltip_opts=opts.TooltipOpts(
                             trigger="axis",
                             axis_pointer_type="shadow"
                         ),  # 提示框
                         xaxis_opts=opts.AxisOpts(name='',
                                                  type_='category',
                                                  axislabel_opts=opts.LabelOpts(rotate=360),
                                                  ),
                         yaxis_opts=opts.AxisOpts(type_="value",  # y轴类型
                                                  max_=bar_max,
                                                  name='票房/亿',  # y轴名称
                                                  name_location='middle',  # y轴名称位置
                                                  name_gap=70,  # y轴名称距离轴线距离
                                                  axistick_opts=opts.AxisTickOpts(is_show=False),  # 刻度线
                                                  axisline_opts=opts.AxisLineOpts(is_show=False),  # y轴线
                                                  splitline_opts=opts.SplitLineOpts(is_show=True),  # y轴网格线
                                                  axislabel_opts=opts.LabelOpts(formatter="{value}"),
                                                  ),  # 轴标签显示方式
                         datazoom_opts=opts.DataZoomOpts(is_zoom_lock=False)
                         )
)

line_all = (
    Line()
        .add_xaxis(xaxis_data=data_all['电影'].tolist())  # x轴
        .add_yaxis(
        series_name="场均人次",  # 名称
        yaxis_index=1,  # 次坐标
        is_smooth=True,  # 线条样式  , 是否设置成圆滑曲线
        y_axis=data_all['场均人次'].tolist(),
        itemstyle_opts={
            "normal": {
                "color": JsCode(
                    """new echarts.graphic.LinearGradient(0, 0, 0, 1, [{
                                        offset: 0,
                                        color: '#2486b9'
                                    }, {
                                        offset: 1,
                                        color: '#FF00FF'
                                    }], false)""", ),
                "opacity": 0.7,
                "barBorderRadius": [45, 45, 45, 45],
                "shadowColor": 'rgb(0, 160, 221)',
            }},
        linestyle_opts={
            'normal': {
                'width': 3,
                'shadowColor': 'rgba(0, 0, 0, 0.5)',
                'shadowBlur': 5,
                'shadowOffsetY': 10,
                'shadowOffsetX': 10,
                'curve': 0.5,
                'color': '#2486b9'
            }
        },
        label_opts=opts.LabelOpts(is_show=False),  # 显示数据标签
    )
    
    .add_yaxis(
        series_name="平均票价",  # 名称
        yaxis_index=1,  # 次坐标
        is_smooth=True,  # 线条样式  , 是否设置成圆滑曲线
        y_axis=data_all['平均票价'].tolist(),
        itemstyle_opts={
            "normal": {
                "color": JsCode(
                    """new echarts.graphic.LinearGradient(0, 0, 0, 1, [{
                                        offset: 0,
                                        color: '#1a6840'
                                    }, {
                                        offset: 1,
                                        color: '#66c18c'
                                    }], false)""", ),
                "opacity": 0.7,
                "barBorderRadius": [45, 45, 45, 45],
                "shadowColor": 'rgb(0, 160, 221)',
            }},
        linestyle_opts={
            'normal': {
                'width': 3,
                'shadowColor': 'rgba(0, 0, 0, 0.5)',
                'shadowBlur': 5,
                'shadowOffsetY': 10,
                'shadowOffsetX': 10,
                'curve': 0.5,
                'color': '#66c18c'
            }
        },
        label_opts=opts.LabelOpts(is_show=False),  # 显示数据标签
    )
)
bar_all.overlap(line_all)  # 图表组合

bar_all.render_notebook()

电影票房榜单 - 国产/进口 - TOP50


tab_rank = Tab()
for i in range(1,3):
    line_max = max(max(data_cat[i]['场均人次'].tolist()), max(data_cat[i]['平均票价'].tolist()))

    bar_max = max(data_cat[i]['票房/亿'].tolist())

    bar1 = (
        Bar(init_opts=opts.InitOpts(width="1000px", height="600px",theme='light'))  # 设置图表大小
            .add_xaxis(xaxis_data=data_cat[i]['电影'].tolist())  # x轴
            .add_yaxis(
            series_name="票房/亿",  # 柱形图系列名称
            y_axis=data_cat[i]['票房/亿'].tolist(),  # 数据
            label_opts=opts.LabelOpts(is_show=False, position='top', formatter="{c}/亿"),  # 显示数据标签
            itemstyle_opts={
                "normal": {
                    "color": JsCode("""new echarts.graphic.LinearGradient(0, 0, 0, 1, [{
                        offset: 0,
                        color: '#ee3f4d'
                    }, {
                        offset: 1,
                        color: '#eea2a4'
                    }], false)""", ),
                    "opacity": 0.8,
    #                 "barBorderRadius": [20, 20, 0, 0],
                    "shadowColor": 'rgb(0, 160, 221)',
                }}
        )
            .extend_axis(  # 设置次坐标轴
            yaxis=opts.AxisOpts(
                name="",  # 次坐标轴名称
                type_="value",  # 次坐标手类型
                min_=-2 * line_max,  # 最小值
                max_=2 * line_max,  # 最大值
                is_show=False,  # 是否显示
                axisline_opts=opts.AxisLineOpts(is_show=False,  # y轴线不显示
                                                linestyle_opts=opts.LineStyleOpts(color='#2486b9')),  # 设置线颜色, 字体颜色也变
                axistick_opts=opts.AxisTickOpts(is_show=False),  # 刻度线不显示
                axislabel_opts=opts.LabelOpts(formatter="{value}"),  # 次坐标轴数据显示格式
            )
        )

            .set_global_opts(title_opts=opts.TitleOpts(title=f"{cat[i]}电影票房 - top50",  # 标题
                                                    title_textstyle_opts=opts.TextStyleOpts(font_size=20),  # 主标题字体大小
                                                    subtitle="",  # 次坐标轴
                                                    pos_left='center',
                                                    pos_top='0.8%'),  # 标题位置
                            legend_opts=opts.LegendOpts(is_show=True,
                                                        pos_top=35,
                                                        orient="horizontal",
                                                        ),  # 不显示图例
                            tooltip_opts=opts.TooltipOpts(
                                trigger="axis",
                                axis_pointer_type="shadow"
                            ),  # 提示框
                            xaxis_opts=opts.AxisOpts(name='',
                                                    type_='category',
                                                    axislabel_opts=opts.LabelOpts(rotate=360),
                                                    ),
                            yaxis_opts=opts.AxisOpts(type_="value",  # y轴类型
                                                    max_=bar_max,
                                                    name='票房/亿',  # y轴名称
                                                    name_location='middle',  # y轴名称位置
                                                    name_gap=70,  # y轴名称距离轴线距离
                                                    axistick_opts=opts.AxisTickOpts(is_show=False),  # 刻度线
                                                    axisline_opts=opts.AxisLineOpts(is_show=False),  # y轴线
                                                    splitline_opts=opts.SplitLineOpts(is_show=True),  # y轴网格线
                                                    axislabel_opts=opts.LabelOpts(formatter="{value}"),
                                                    ),  # 轴标签显示方式
                            datazoom_opts=opts.DataZoomOpts(is_zoom_lock=False)
                            )
    )

    line1 = (
        Line()
            .add_xaxis(xaxis_data=data_cat[i]['电影'].tolist())  # x轴
            .add_yaxis(
            series_name="场均人次",  # 名称
            yaxis_index=1,  # 次坐标
            is_smooth=True,  # 线条样式  , 是否设置成圆滑曲线
            y_axis=data_cat[i]['场均人次'].tolist(),
            itemstyle_opts={
                "normal": {
                    "color": JsCode(
                        """new echarts.graphic.LinearGradient(0, 0, 0, 1, [{
                                            offset: 0,
                                            color: '#2486b9'
                                        }, {
                                            offset: 1,
                                            color: '#FF00FF'
                                        }], false)""", ),
                    "opacity": 0.7,
                    "barBorderRadius": [45, 45, 45, 45],
                    "shadowColor": 'rgb(0, 160, 221)',
                }},
            linestyle_opts={
                'normal': {
                    'width': 3,
                    'shadowColor': 'rgba(0, 0, 0, 0.5)',
                    'shadowBlur': 5,
                    'shadowOffsetY': 10,
                    'shadowOffsetX': 10,
                    'curve': 0.5,
                    'color': '#2486b9'
                }
            },
            label_opts=opts.LabelOpts(is_show=False),  # 显示数据标签
        )
        
        .add_yaxis(
            series_name="平均票价",  # 名称
            yaxis_index=1,  # 次坐标
            is_smooth=True,  # 线条样式  , 是否设置成圆滑曲线
            y_axis=data_cat[i]['平均票价'].tolist(),
            itemstyle_opts={
                "normal": {
                    "color": JsCode(
                        """new echarts.graphic.LinearGradient(0, 0, 0, 1, [{
                                            offset: 0,
                                            color: '#1a6840'
                                        }, {
                                            offset: 1,
                                            color: '#66c18c'
                                        }], false)""", ),
                    "opacity": 0.7,
                    "barBorderRadius": [45, 45, 45, 45],
                    "shadowColor": 'rgb(0, 160, 221)',
                }},
            linestyle_opts={
                'normal': {
                    'width': 3,
                    'shadowColor': 'rgba(0, 0, 0, 0.5)',
                    'shadowBlur': 5,
                    'shadowOffsetY': 10,
                    'shadowOffsetX': 10,
                    'curve': 0.5,
                    'color': '#66c18c'
                }
            },
            label_opts=opts.LabelOpts(is_show=False),  # 显示数据标签
        )
    )
    bar1.overlap(line1)  # 图表组合
    tab_rank.add(bar1, cat[i])
tab_rank.add(table, "点击预览")
tab_rank.render_notebook()




计算上榜电影标签汇总

tags_china = []
tag_china = data_china['作品类型'].tolist()
for t in tag_china:
    try:
        for i in t.split('/'):
            tags_china.append(i)
    except:
        continue
 
tags_china_pair = []
for key, value in Counter(tags_china).items():
    tags_china_pair.append([key, value])

print(tags_china_pair)
tags_foreign = []
tag_foreign = data_foreign['作品类型'].tolist()
for t in tag_foreign:
    try:
        for i in t.split('/'):
            tags_foreign.append(i)
    except:
        continue
 
tags_foreign_pair = []
for key, value in Counter(tags_foreign).items():
    tags_foreign_pair.append([key, value])

国产-进口上榜 - TOP50 - 详情分布

pie = (
    Pie(init_opts=opts.InitOpts(width="1000px", height="900px", theme='light'))
        .add('国产年份', [list(z) for z in zip(data_china_year.index.tolist(),
                                       data_china_year.values.tolist())],
             radius=['55', '100'],
             center=['33%', '30%']
             )
        .add('进口', [list(z) for z in zip(data_foreigna_year.index.tolist(),
                                       data_foreigna_year.values.tolist())],
             radius=['55', '100'],
             center=['75%', '30%'])
        .add('国产电影标签', tags_china_pair,
             radius=['55', '100'],
             center=['33%', '80%']
             )
        .add('进口电影标签', tags_foreign_pair,
             radius=['55', '100'],
             center=['75%', '80%']
             )
        .set_series_opts(
            label_opts=opts.LabelOpts(formatter="{b}: {c}", font_size=14),
            tooltip_opts=opts.TooltipOpts(trigger="item", formatter="{a} <br/>{b}: {c} ({d}%)"),
            itemstyle_opts={"normal": {
                                        'shadowBlur': 2,
                                        "borderColor": '#87CEFA',
                                        "borderWidth": 3,
                                        'shadowColor': '#87CEFA',
                                        'opacity': 1
                                    }
                           })
        .set_global_opts(
            legend_opts=opts.LegendOpts(is_show=False, pos_top='5%'),
            title_opts=[
                dict(
                    text=f'国产-进口上榜 - TOP50 - 详情分布',
                    left='center',
                    top='1%',
                    textStyle=dict(
                        color='#000',
                        fontSize=24)),
                dict(
                    text=f'国产分布',
                    left='28%',
                    top='10%',
                    textStyle=dict(
                        color='#999999',
                        fontSize=18)),
                dict(
                    text=f'进口分布',
                    left='70%',
                    top='10%',
                    textStyle=dict(
                        color='#999999',
                        fontSize=18)),
                dict(
                    text=f'国产电影标签',
                    left='28%',
                    top='55%',
                    textStyle=dict(
                        color='#999999',
                        fontSize=18)),
                dict(
                    text=f'进口电影标签',
                    left='70%',
                    top='55%',
                    textStyle=dict(
                        color='#999999',
                        fontSize=18)),
            ],
            )
)
pie.render_notebook()


国产电影上映首周票房表现 -Top50

bar_china = (
    Bar(init_opts=opts.InitOpts(width="1200px", height="600px", theme='light')) # 设置图表大小
    .add_xaxis(xaxis_data=data_china['电影'].tolist())  # x轴
    .add_yaxis(
        series_name="首映票房/亿",  #柱形图系列名称
        stack='stack1',
        y_axis=data_china['首映票房/亿'].tolist(), # 数据
        label_opts=opts.LabelOpts(is_show=False,position='top',formatter="{c} 亿"), # 显示数据标签
        itemstyle_opts={
            "normal": {
                "color": JsCode("""new echarts.graphic.LinearGradient(0, 0, 0, 1, [{
                    offset: 0,
                    color: '#126bae'
                }, {
                    offset: 1,
                    color: '#619ac3'
                }], false)""", ),
                "opacity": 0.8,
#                 "barBorderRadius": [20, 20, 0, 0],
                'shadowBlur': 4,
                'shadowColor': 'rgba(0, 0, 0, 0.3)',
                'shadowOffsetX': 5,
                'shadowOffsetY': 5,
                'borderColor': 'rgb(220,220,220)',
                'borderWidth': 1
            }}
        )
    .add_yaxis(
        series_name="首周票房/亿",  #柱形图系列名称
        stack='stack1',
        y_axis=data_china['首周票房/亿'].tolist(), # 数据
        label_opts=opts.LabelOpts(is_show=False,position='top',formatter="{c} 亿"), # 显示数据标签
        itemstyle_opts={
            "normal": {
                "color": JsCode("""new echarts.graphic.LinearGradient(0, 0, 0, 1, [{
                    offset: 0,
                    color: '#ea7293'
                }, {
                    offset: 1,
                    color: '#ec8aa4'
                }], false)""", ),
                "opacity": 0.8,
#                 "barBorderRadius": [20, 20, 0, 0],
                'shadowBlur': 4,
                'shadowColor': 'rgba(0, 0, 0, 0.3)',
                'shadowOffsetX': 5,
                'shadowOffsetY': 5,
                'borderColor': 'rgb(220,220,220)',
                'borderWidth': 1
            }}
        )

    .add_yaxis(
        series_name="首周末票房/亿",  #柱形图系列名称
        stack='stack1',
        y_axis=data_china['首周末票房/亿'].tolist(), # 数据
        label_opts=opts.LabelOpts(is_show=False,position='top',formatter="{c} 亿"), # 显示数据标签
        itemstyle_opts={
            "normal": {
                "color": JsCode("""new echarts.graphic.LinearGradient(0, 0, 0, 1, [{
                    offset: 0,
                    color: '#9eccab'
                }, {
                    offset: 1,
                    color: '#a4cab6'
                }], false)""", ),
                "opacity": 0.8,
#                 "barBorderRadius": [20, 20, 0, 0],
                'shadowBlur': 4,
                'shadowColor': 'rgba(0, 0, 0, 0.3)',
                'shadowOffsetX': 5,
                'shadowOffsetY': 5,
                'borderColor': 'rgb(220,220,220)',
                'borderWidth': 1
            }}
        )
    
    .reversal_axis()
    # .set_series_opts(label_opts=opts.LabelOpts(position="right"))
    .set_global_opts(title_opts=opts.TitleOpts(title="国产电影上映首周票房表现 -Top50",# 标题
                                               title_textstyle_opts=opts.TextStyleOpts(font_size=20), #主标题字体大小
                                               subtitle="", # 次坐标轴
                                               pos_left='center'),# 标题位置
                    legend_opts=opts.LegendOpts(
                                             is_show=True,
                                             pos_top=30,
                                             orient="horizontal"
                                                             ),  # 不显示图例
                    tooltip_opts=opts.TooltipOpts(
                                             trigger="axis",
                                             axis_pointer_type="shadow"
                                             ),# 提示框
                    yaxis_opts=opts.AxisOpts(name='',
                                            type_='category',                                           
                                            #    axislabel_opts=opts.LabelOpts(rotate=30),
                                               ),
                     xaxis_opts=opts.AxisOpts(type_="value", # y轴类型
                                            #   max_=5000000,
                                              name='', # y轴名称
                                              name_location='middle', # y轴名称位置
                                              name_gap=70,  # y轴名称距离轴线距离
                                              axistick_opts=opts.AxisTickOpts(is_show=False),   # 刻度线
                                              axisline_opts=opts.AxisLineOpts(is_show=False),   # y轴线
                                              splitline_opts=opts.SplitLineOpts(is_show=True),   # y轴网格线
                                              axislabel_opts=opts.LabelOpts(formatter="{value}")), # 轴标签显示方式
                     datazoom_opts=opts.DataZoomOpts(is_zoom_lock=False,
                                                    orient="vertical")
                                               )
)
bar_china.render_notebook()


进口电影上映首周票房表现 -Top50


bar_foreign = (
    Bar(init_opts=opts.InitOpts(width="1200px", height="600px", theme='light')) # 设置图表大小
    .add_xaxis(xaxis_data=data_foreign['电影'].tolist())  # x轴
    .add_yaxis(
        series_name="首映票房/亿",  #柱形图系列名称
        stack='stack1',
        y_axis=data_foreign['首映票房/亿'].tolist(), # 数据
        label_opts=opts.LabelOpts(is_show=False,position='top',formatter="{c} 亿"), # 显示数据标签
        itemstyle_opts={
            "normal": {
                "color": JsCode("""new echarts.graphic.LinearGradient(0, 0, 0, 1, [{
                    offset: 0,
                    color: '#126bae'
                }, {
                    offset: 1,
                    color: '#619ac3'
                }], false)""", ),
                "opacity": 0.8,
#                 "barBorderRadius": [20, 20, 0, 0],
                'shadowBlur': 4,
                'shadowColor': 'rgba(0, 0, 0, 0.3)',
                'shadowOffsetX': 5,
                'shadowOffsetY': 5,
                'borderColor': 'rgb(220,220,220)',
                'borderWidth': 1
            }}
        )
    .add_yaxis(
        series_name="首周票房/亿",  #柱形图系列名称
        stack='stack1',
        y_axis=data_foreign['首周票房/亿'].tolist(), # 数据
        label_opts=opts.LabelOpts(is_show=False,position='top',formatter="{c} 亿"), # 显示数据标签
        itemstyle_opts={
            "normal": {
                "color": JsCode("""new echarts.graphic.LinearGradient(0, 0, 0, 1, [{
                    offset: 0,
                    color: '#ea7293'
                }, {
                    offset: 1,
                    color: '#ec8aa4'
                }], false)""", ),
                "opacity": 0.8,
#                 "barBorderRadius": [20, 20, 0, 0],
                'shadowBlur': 4,
                'shadowColor': 'rgba(0, 0, 0, 0.3)',
                'shadowOffsetX': 5,
                'shadowOffsetY': 5,
                'borderColor': 'rgb(220,220,220)',
                'borderWidth': 1
            }}
        )

    .add_yaxis(
        series_name="首周末票房/亿",  #柱形图系列名称
        stack='stack1',
        y_axis=data_foreign['首周末票房/亿'].tolist(), # 数据
        label_opts=opts.LabelOpts(is_show=False,position='top',formatter="{c} 亿"), # 显示数据标签
        itemstyle_opts={
            "normal": {
                "color": JsCode("""new echarts.graphic.LinearGradient(0, 0, 0, 1, [{
                    offset: 0,
                    color: '#9eccab'
                }, {
                    offset: 1,
                    color: '#a4cab6'
                }], false)""", ),
                "opacity": 0.8,
#                 "barBorderRadius": [20, 20, 0, 0],
                'shadowBlur': 4,
                'shadowColor': 'rgba(0, 0, 0, 0.3)',
                'shadowOffsetX': 5,
                'shadowOffsetY': 5,
                'borderColor': 'rgb(220,220,220)',
                'borderWidth': 1
            }}
        )
    
    .reversal_axis()
    # .set_series_opts(label_opts=opts.LabelOpts(position="right"))
    .set_global_opts(title_opts=opts.TitleOpts(title="进口电影上映首周票房表现 -Top50",# 标题
                                               title_textstyle_opts=opts.TextStyleOpts(font_size=20), #主标题字体大小
                                               subtitle="", # 次坐标轴
                                               pos_left='center'),# 标题位置
                    legend_opts=opts.LegendOpts(
                                             is_show=True,
                                             pos_top=30,
                                             orient="horizontal"
                                                             ),  # 不显示图例
                    tooltip_opts=opts.TooltipOpts(
                                             trigger="axis",
                                             axis_pointer_type="shadow"
                                             ),# 提示框
                    yaxis_opts=opts.AxisOpts(name='',
                                            type_='category',                                           
                                            #    axislabel_opts=opts.LabelOpts(rotate=30),
                                               ),
                     xaxis_opts=opts.AxisOpts(type_="value", # y轴类型
                                            #   max_=5000000,
                                              name='', # y轴名称
                                              name_location='middle', # y轴名称位置
                                              name_gap=70,  # y轴名称距离轴线距离
                                              axistick_opts=opts.AxisTickOpts(is_show=False),   # 刻度线
                                              axisline_opts=opts.AxisLineOpts(is_show=False),   # y轴线
                                              splitline_opts=opts.SplitLineOpts(is_show=True),   # y轴网格线
                                              axislabel_opts=opts.LabelOpts(formatter="{value}")), # 轴标签显示方式
                     datazoom_opts=opts.DataZoomOpts(is_zoom_lock=False,
                                                    orient="vertical")
                                               )
)
bar_foreign.render_notebook()

电影票房三十日时段详情

data_movie_time = pd.read_excel(r"/home/mw/input/movie7110/电影票房三十日时段详情.xlsx")
data_movie_time["当前票房"] = data_movie_time["当前票房"].apply(lambda x: round(x/10000000, 2))
data_movie_time["当前场次"] = data_movie_time["当前场次"].apply(lambda x: round(x/10000, 2))
data_movie_time["当前人次"] = data_movie_time["当前人次"].apply(lambda x: round(x/1000000, 2))
data_movie_time = data_movie_time.rename(columns={"当前票房": "当前票房/千万", "当前场次": "当前场次/万", "当前人次": "当前人次/百万"})
data_movie_time.head(2)
movie_chang = data_movie_time[data_movie_time["电影"] == "长津湖"]

长津湖上映后三十日电影票房表现

line = Line(
    init_opts=opts.InitOpts(
        theme='light',
        width='1000px',
        height='600px')
)

line.add_xaxis(
    movie_chang["日期"].tolist()
)

colums = ["当前票房/千万", "当前人次/百万", "当前场次/万"]
for i in range(3):

    line.add_yaxis(
        colums[i],
        movie_chang[colums[i]],
        is_symbol_show=False,
        is_smooth=True,
        is_selected=True,
        areastyle_opts=opts.AreaStyleOpts(opacity=0.5),
        label_opts=opts.LabelOpts(is_show=False),
        z=100,
        linestyle_opts={
                "normal": {
                    "shadowColor": 'rgba(0, 0, 0, .5)',
                    "shadowBlur": 0,
                    "shadowOffsetY": 1,
                    "shadowOffsetX": 1,
                },
            },
    )

line.set_global_opts(
    xaxis_opts=opts.AxisOpts(
        boundary_gap=False,
        axislabel_opts=opts.LabelOpts(margin=30, color="black"),
        axistick_opts=opts.AxisTickOpts(is_show=False),),
    yaxis_opts=opts.AxisOpts(
        name='',
        axisline_opts=opts.AxisLineOpts(is_show=True),
        axistick_opts=opts.AxisTickOpts(is_show=False),
        splitline_opts=opts.SplitLineOpts(
            is_show=True,
            linestyle_opts=opts.LineStyleOpts(color='#483D8B'))
    ),
    tooltip_opts=opts.TooltipOpts(
        is_show=True, trigger='axis', axis_pointer_type='cross'),
    title_opts=opts.TitleOpts(title="长津湖上映后三十日电影票房表现",# 标题
                            title_textstyle_opts=opts.TextStyleOpts(font_size=18), #主标题字体大小
                            subtitle="2021-09-30~2021-10-30", # 次坐标轴
                            pos_left='center'),# 标题位置
    legend_opts=opts.LegendOpts(
                                is_show=True,
                                pos_top=45,
                                orient="horizontal"
                                                ),  # 不显示图例

    graphic_opts=[
                opts.GraphicGroup(
                            graphic_item=opts.GraphicItem(id_='1',left="center", top="center", z=-1),
                            children=[
                                    opts.GraphicImage(graphic_item=opts.GraphicItem(id_="logo",
                                                                                    left='center',
                                                                                    z=-1),
                                                      graphic_imagestyle_opts=opts.GraphicImageStyleOpts(
                                        image="https://img2.baidu.com/it/u=3979355417,3562690433&fm=253&fmt=auto&app=138&f=JPEG?w=500&h=388",
                                        width=1000,
                                        height=600,
                                        opacity=0.5,)
                                    )
                                ]
                                )
                                ]
)

line.set_series_opts(
   
    markarea_opts=opts.MarkAreaOpts(
        is_silent=True,
        label_opts=opts.LabelOpts(position='bottom', color='#000000'),
        itemstyle_opts=opts.ItemStyleOpts(color='#1E90FF', opacity=0.2),
        data=[
            opts.MarkAreaItem(name="正式上映\n国庆档", x=("2021-09-30", "2021-10-01")),
            opts.MarkAreaItem(name="高峰期", x=("2021-10-05", "2021-10-07")),
            opts.MarkAreaItem(name="第三周\n小高峰", x=("2021-10-15", "2021-10-17")),
        ]
    ),
)
line.set_colors(colors=['#80FFA5', '#00DDFF', '#FF0087'])
line.render_notebook()

长津湖电影评分

chart = Gauge(
)
chart.add(
    "",
    [("猫眼评分", 9.5)],
    max_=10,
    start_angle=200,
    end_angle=-20,
    pointer=opts.GaugePointerOpts(
        is_show=True
    ),
    itemstyle_opts=opts.ItemStyleOpts(
        color='rgba(50, 163, 107, 0.3)'
    ),
    detail_label_opts=opts.GaugeDetailOpts(
        border_radius=8,
        offset_center=[0, '15%'],
        font_size=50,
        font_weight='bolder',
        formatter='{value}',
    ),
    axisline_opts=opts.AxisLineOpts(
        is_show=True,
        linestyle_opts=opts.LineStyleOpts(
            width=30,
            color=[(0.8, "#67e0e3"), (0.98, "#D4587A"), (1, "#67e0e3")]
        )
    ),
    title_label_opts=opts.GaugeTitleOpts(
        color='rgba(217, 48, 118, 0.9)',
        offset_center=[0, '-35%'],
        font_size=20,
        font_weight='bolder',
    )
)

chart.set_global_opts(
    title_opts=opts.TitleOpts(
        title="长津湖",
        pos_right='0%',
        pos_bottom='30%',
        title_textstyle_opts=opts.TextStyleOpts(
            color='rgba(217, 48, 118, 0.1)',
            font_size=80
        )
    ),
)
chart.render_notebook()
chart_1 = Gauge(
    # init_opts=opts.InitOpts(
    #     width='500px',
    #     height='500px'
    # )
)
chart_1.add(
    "",
    [("豆瓣评分", 7.4)],
    max_=10,
    start_angle=200,
    end_angle=-20,
    pointer=opts.GaugePointerOpts(
        is_show=True
    ),
    itemstyle_opts=opts.ItemStyleOpts(
        color='rgba(50, 163, 107, 0.3)'
    ),
    detail_label_opts=opts.GaugeDetailOpts(
        border_radius=8,
        offset_center=[0, '15%'],
        font_size=50,
        font_weight='bolder',
        formatter='{value}',
    ),
    axisline_opts=opts.AxisLineOpts(
        is_show=True,
        linestyle_opts=opts.LineStyleOpts(
            width=30,
            color=[(0.7, "#37a2da"), (0.8, "#D4587A"), (1, "#37a2da")]
        )
    ),
    title_label_opts=opts.GaugeTitleOpts(
        color='rgba(217, 48, 118, 0.9)',
        offset_center=[0, '-35%'],
        font_size=20,
        font_weight='bolder',
    )
)
 
chart_1.set_global_opts(
    title_opts=opts.TitleOpts(
        title="长津湖",
        pos_right='0%',
        pos_bottom='30%',
        title_textstyle_opts=opts.TextStyleOpts(
            color='rgba(217, 48, 118, 0.1)',
            font_size=80
        )
    ),
)
chart_1.render_notebook()


分析总结

①在全部的榜单类别top50中排在前面的都是进五年新出的电影,其中第一名是2021年上映的长津湖,说明电影行业的发展是非常快速的,推陈出新的要求是广大影迷朋友们所追求的。

②排在榜单前六的都是国产电影,说明大家对国产电影的喜爱程度非常之高,其中排在前二的是不可多得的主旋律好电影,非常受大家的追捧。
③在结合票房分析的同时也要结合每一部电影它的组成,可以看到战狼的票价是排在前几的电影中最低的,同时也是场均人次最高的,说明战狼这部电影的电影票房是实打实的非常有质量的票房数据,非常说明战狼这部电影的影响力和受大家喜爱程度。

④在进口的电影中,可以非常明显的看到几个场均人次异常突出的几部电影,如阿凡达,变形金刚三和泰坦尼克号,可以看出来这三部电影的上座率非常高,说明质量非常的好,不愧是经典中的经典。

⑤在国产电影和进口电影的对拼中可以看到在2018年之前进口电影的市场占有率是高于国产电影的,到2018年国产电影成长到足够抗衡进口电影,如今2021年国产电影更是已经碾压进口电影,占领大部分中国市场。

⑥可以看到国产电影和进口电影都有一个经久不衰的主题,那就是动作篇,可以想到动作片是非常受全世界影迷的喜爱的,其中最明显的差距是国产电影中的科幻片很少,仍需要不断地发展才能满足更多影迷,不同影迷的需要。

⑦在不同的平台上长津湖的评分是不同的,高也好低也好,不同的平台的用户的口味是不同的,这就是电影的魅力所在,让不同的人体验到不同的感受。


总结

只要是好的电影,现今的观众都会予以支持。
创作者在生产创作阶段就充分考虑目标受众和目标受众的需求。具有强情节、强情绪、强话题等核心竞争力的影片,哪怕前期热度不具优势,映后也会凭借优质的内容不断发酵,激发二轮观影动机;对于能够满足市场刚需的内容,像动作、喜剧、悬疑犯罪、亲子动画等类型片,也是能够持续号召目标受众观影的常备题材;基于优质的类型片持续运作、打造具有号召力的IP或系列电影,则能将观影动机前置;通过强化电影的社交属性,比如通过打造仪式感来附加观众额外的观影动机,甚至能够为市场培育出新的档期。
总而言之,观众并非不爱看电影了,只是观众更加倾向选择好电影,只要是内容足够优秀,在哪里都是档期。
挑战就是新的起点。目前,8万块银幕已经遍布中国的大城小镇,不断提升的观影环境,日益丰富的电影传播渠道和购票的便利性等,都是中国电影高质量发展的重要保障。“电影是综合性艺术,与国家的综合实力联系紧密。依托发达的经济、繁荣的文化、先进的科技,中国电影理应进入品质年代,我们有理由相信中国电影未来可期。”中国电影家协会副主席任仲伦说。​​​​

有关2022-11-28-大数据可视化“可视化国产/进口电影票房榜单”分析,特征维度大于50的更多相关文章

  1. ruby - 如何根据特征实现 FactoryGirl 的条件行为 - 2

    我有一个用户工厂。我希望默认情况下确认用户。但是鉴于unconfirmed特征,我不希望它们被确认。虽然我有一个基于实现细节而不是抽象的工作实现,但我想知道如何正确地做到这一点。factory:userdoafter(:create)do|user,evaluator|#unwantedimplementationdetailshereunlessFactoryGirl.factories[:user].defined_traits.map(&:name).include?(:unconfirmed)user.confirm!endendtrait:unconfirmeddoenden

  2. ruby - Ruby 中的波形可视化 - 2

    我即将开始一个将录制和编辑音频文件的项目,我正在寻找一个好的库(最好是Ruby,但会考虑Java或.NET以外的任何库)以进行实时可视化波形。有人知道我应该从哪里开始搜索吗? 最佳答案 要流入浏览器的数据量很大。Flash或Flex图表可能是唯一能提高内存效率的解决方案。Javascript图表往往会因大型数据集而崩溃。 关于ruby-Ruby中的波形可视化,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.c

  3. ruby - cucumber 特征和步骤定义 - 2

    我是Cucumber测试的新手。我创建了两个特征文件:events.featurepartner.feature并将我的步骤定义放在step_definitions文件夹中:./step_definitions/events.rbpartner.rbCucumber似乎在所有.rb文件中查找步骤信息。有没有办法限制该功能查看特定的步骤定义文件?我之所以要这样做,是因为即使我使用了--guess标志,我也会遇到不明确的匹配错误。我之所以要这样做,有以下几个原因。我正在测试CMS,并希望在不同的功能中测试每种不同的内容类型(事件和合作伙伴)。事件.特征Feature:AddpartnerA

  4. ruby-on-rails - 特征未注册 : attribute name - 2

    完成这个有困难。我正在使用seed.rb+factory_girl来使用rakedb:seed填充数据库。(我知道固定装置存在,但我想以这种方式完成,这只是一个示例,数据库将填充复杂的关联对象。)我的种子.rb:require'factory_girl_rails'["QM","CDC","SI","QS"].eachdo|n|FactoryGirl.create(:grau,nome:n)end还有我的/factories/graus.rbFactoryGirl.definedofactory:graudonomeendend但是当我运行时:rakedb:seed我得到:rakeab

  5. 映宇宙2022年营收63亿元:同比下降三成,毛利率提升4.3个百分点 - 2

    3月26日,映宇宙(HK:03700,即“映客”)发布截至2022年12月31日的2022年度业绩财务报告。财报显示,映宇宙2022年的总营收为63.19亿元,较2021年同期的91.76亿元下降31.1%。2022年,映宇宙的经营亏损为4698.7万元,2021年同期则为净利润4.57亿元;期内亏损(净亏损)为1.68亿元,2021年同期的净利润为4.33亿元;非国际财务报告准则经调整净利润为3.88亿元,2021年同期为4.82亿元,同比下降19.6%。 映宇宙在财报中表示,收入减少主要是由于行业竞争加剧,该集团对旗下产品采取更为谨慎的运营策略以应对市场变化。不过,映宇宙的毛利率则有所提升

  6. ruby-on-rails - FactoryGirl工厂特征内的序列不使用主序列计数器 - 2

    我有以下工厂:FactoryGirl.definedofactory:foodosequence(:name){|n|"Foo#{n}"}trait:ydosequence(:name){|n|"Fooy#{n}"}endendend如果我跑create:foocreate:foocreate:foo,:y我得到Foo1,Foo2,Fooy1。但我想要Foo1,Foo2,Fooy3。我怎样才能做到这一点? 最佳答案 经过smile2day'sanswer的一些提示后和thisanswer,我得出以下解决方案:FactoryGirl.

  7. ruby-on-rails - 在 ruby​​ 进程之间处理大数据对象 - 2

    如果使用Marshal.dump写入文件,我有一个Ruby散列达到大约10兆字节。gzip压缩后约为500KB。在ruby​​中迭代和改变这个散列是非常快的(几分之一毫秒)。即使复制它也非常快。问题是我需要在RubyonRails进程之间共享此散列中的数据。为了使用Rails缓存(file_store或memcached)执行此操作,我需要先Marshal.dump文件,但这会在序列化文件时产生1000毫秒的延迟,在序列化文件时产生400毫秒的延迟。理想情况下,我希望能够在100毫秒内从每个进程保存和加载此哈希。一个想法是生成一个新的Ruby进程来保存这个散列,该散列为其他进程提供AP

  8. Unity数据可视化图表插件XCharts3.0发布 - 2

    Unity数据可视化图表插件XCharts3.0发布历时8个多月,业余时间,断断续续,XCharts3.0总算发布了。如果要打个满意度,我给3.0版本来个80分。对于代码框架结构设计的调整改动,基本符合预期,甚是满意。相比之前的1.0和2.0版本,我认为3.0才是一个拿得出手给广大开发者使用的版本。1.0发布的时候,很兴奋,从0.1到1.0,也磨了一年,真的等不及想给大家试用了,还特地写过一篇文章以示庆祝。那个时候,1.0虽然还还不够完善,功能也不够丰富,但它是XCharts的开始,没有1.0,也就没有后面的2.0和3.0。后面的2.0发布,做了很多改进和优化,随着版本迭代,慢慢的发现有不少硬

  9. 企业大数据发展面临问题之存算分离技术思考 - 2

    文章目录概述背景为何要存算分离优势**应用场景**存算分离产品技术流派华为JuiceFSHashDataXSKY概述背景Hadoop一出生就是奔存算一体设计,当时设计思想就是存储不动而计算(code也即是代码程序)动,负责调度Yarn会把计算任务尽量发到要处理数据所在的实例上,这也是与传统集中式存储最大的不同。为何当时Hadoop设计存算一体的耦合?要知道2006年服务器带宽只有100Mb/s~1Gb/s,但是HDD也即是磁盘吞吐量有50MB/s,这样带宽远远不够传输数据,网络瓶颈尤为明显,无奈之举只好把计算任务发到数据所在的位置。众观历史常言道天下分久必合合久必分,随着云计算技术的发展,数据

  10. 大数据之Hadoop数据仓库Hive - 2

    目录:一、简介二、HQL的执行流程三、索引四、索引案例五、Hive常用DDL操作六、Hive常用DML操作七、查询结果插入到表八、更新和删除操作九、查询结果写出到文件系统十、HiveCLI和Beeline命令行的基本使用十一、Hive配置一、简介Hive是一个构建在Hadoop之上的数据仓库,它可以将结构化的数据文件映射成表,并提供类SQL查询功能,用于查询的SQL语句会被转化为MapReduce作业,然后提交到Hadoop上运行。特点:简单、容易上手(提供了类似sql的查询语言hql),使得精通sql但是不了解Java编程的人也能很好地进行大数据分析;灵活性高,可以自定义用户函数(UDF)和

随机推荐