大家好,我是带我去滑雪!
本期为大家带来一个基于python的数据可视化教学,绘制动态柱形图与动态折线图。
目录
(1)绘制动态柱形图
(2)绘制动态折线图
GDP是指一个国家或地区的区域内生产总值,包括所有产品和服务的价值,是衡量该区域总体经济的核心指标,它反映了一个国家或地区的经济实力和市场规模。美国能够成为超级大国近百年,这背后的一个主要原因就是因为美国的GDP已经125年来都是世界第一了,经济基础决定上层建筑,强大的经济实力才是保障美国各方面都比较强大的基础。我国自1980年开始逐步的改革开放,GDP在2010年的时候超过日本,成为世界第二,这10年来世界GDP的冠亚军一直都是美国和中国。
下面我们绘制1960年到2022年全球GDP前10国家排名的动态折线图来直观展示。
import pandas as pd import matplotlib.pyplot as plt import matplotlib.animation as animation import platform import sys # 导入所用到的相关python包 from pyecharts.options import * from pyecharts.globals import ThemeType from pyecharts.options.global_options import ThemeType from pyecharts import options as opts from pyecharts.charts import Bar, Timeline from pyecharts.options import * from pyecharts.globals import ThemeType import pandas as pd # 读取数据 f = open("E:/工作/硕士/博客/博客-数据可视化/实现/1960-2022全球GDP数据.csv", "r",encoding='GB2312') data_lines = f.readlines() # 关闭文件 f.close() # 删除第一条数据 data_lines.pop(0) # 将数据转换为字典存储,格式为: # { 年份: [ [国家, gdp], [国家,gdp], ...... ], 年份: [ [国家, gdp], [国家,gdp], ...... ], ...... } # { 1960: [ [美国, 123], [中国,321], ...... ], 1961: [ [美国, 123], [中国,321], ...... ], ...... } # 先定义一个字典对象 data_dict = {} for line in data_lines: year = int(line.split(",")[0]) # 年份 country = line.split(",")[1] # 国家 gdp = float(line.split(",")[2]) # gdp数据 # 如何判断字典里面有没有指定的key呢? try: data_dict[year].append([country, gdp]) except KeyError: data_dict[year] = [] data_dict[year].append([country, gdp]) # print(data_dict[1960]) # 创建时间线对象 timeline = Timeline({"theme": ThemeType.DARK}) # 排序年份 sorted_year_list = sorted(data_dict.keys()) for year in sorted_year_list: data_dict[year].sort(key=lambda element: element[1], reverse=True) # 取出本年份前10名的国家 year_data = data_dict[year][0:10] x_data = [] y_data = [] for country_gdp in year_data: x_data.append(country_gdp[0]) # x轴添加国家 y_data.append(round((country_gdp[1] / 100000000),2)) # y轴添加gdp数据 # 构建柱状图 bar = Bar() x_data.reverse() y_data.reverse() bar.add_xaxis(x_data) bar.add_yaxis("GDP年度总量(亿美元)", y_data, label_opts=LabelOpts(position="right"),itemstyle_opts=opts.ItemStyleOpts(color='red')) # 反转x轴和y轴 bar.reversal_axis() # 设置每一年的图表的标题 bar.set_global_opts( title_opts=TitleOpts(title=f"{year}年GDP总量全球前10排名",title_textstyle_opts=dict(color='red')) ) timeline.add(bar, str(year)) # for循环每一年的数据,基于每一年的数据,创建每一年的bar对象 # 在for中,将每一年的bar对象添加到时间线中 # 设置时间线自动播放 timeline.add_schema( play_interval=1000, is_timeline_show=True, is_auto_play=True, is_loop_play=False ) # 绘图 timeline.render("1960-2022全球GDP前10国家排名.html") 输出结果:
经济规模壮大,大中小型企业的竞相发展,功不可没。1996年,《财富》杂志设立世界500强企业排行的初始阶段,含中国香港及中国台湾企业数据在内,中企入榜数量仅有4家。2001年,中国加入世界贸易组织,当年入榜的中企也仅为12家。2008年后,数量增长提速,先后超过德国、英国、法国,日本,并在2019年以129家的数量,超越美国,成为全球第一。
下面我们绘制1996-2022年历年中美全球500企业数量走势对比图,来直观展示。
import numpy as np import pandas as pd import matplotlib as mpl from matplotlib import pyplot as plt import matplotlib.animation as animation import pandas as pd import matplotlib import matplotlib.pyplot as plt import numpy as np matplotlib.rcParams['font.sans-serif'] = ['SimHei'] # 用黑体显示中文 cmap = [ '#2E91E5', '#1CA71C', '#DA16FF', '#B68100', '#EB663B', '#00A08B', '#FC0080', '#6C7C32', '#862A16', '#620042', '#DA60CA', '#0D2A63'] * 100 mpl.rcParams['animation.writer'] = 'html' def line_chart_race(df, filename=None, title="", figsize=(8, 4.5), dpi=300, duration=0.5): assert "date" in df.columns, "df should with a column date!" assert filename is None or filename.endswith(".html"), "filename should like *.html!" fig, ax = plt.subplots(figsize=figsize, dpi=150) ax.set_facecolor("0.9") # 调整spines ax.spines["top"].set_visible(False) ax.spines["right"].set_visible(False) ax.spines["left"].set_visible(False) ax.spines["bottom"].set_visible(False) def plot_frame(date): dfdata = df.loc[df["date"] <= date, :] dfdata.index = dfdata["date"] idx = range(len(dfdata)) ax.clear() cols = [name for name in dfdata.columns if name != "date"] for i, col in enumerate(cols): ax.plot(idx, dfdata[col], color=cmap[i], lw=4) px, py = idx[-1], dfdata[col].iloc[-1] ax.scatter(px, py, color=cmap[i], edgecolor="black", s=200, lw=2.5, zorder=4) ax.annotate(col + ":\n" + str(py), xy=(px, py), xycoords="data", xytext=(10, 2), fontweight="bold", color=cmap[i], textcoords="offset points") # 调整绘图范围 xlim = (0, len(df)) ax.set_xlim(xmin=xlim[0] - (xlim[1] - xlim[0]) / 10, xmax=xlim[1] + (xlim[1] - xlim[0]) / 10) values = df[[x for x in df.columns if x != "date"]].values ylim = (values.min(), values.max()) ax.set_ylim(ymin=ylim[0] - (ylim[1] - ylim[0]) / 10, ymax=ylim[1] + (ylim[1] - ylim[0]) / 10) # 设置xticks n = len(df) ticks_num = 12 delta = int(np.ceil(n / ticks_num)) ticks = list(range(0, n, delta)) dates = df["date"].tolist() ticklabels = [dates[i] for i in ticks] ax.set_xticks(ticks) ax.set_xticklabels(ticklabels) ax.tick_params(bottom=False, left=False, labelsize=8, direction="in", length=2) # 添加辅助元素 s = dfdata["date"].iloc[-1] ax.text(0.5, 0.5, s, va="center", ha="center", alpha=0.3, size=25, transform=ax.transAxes) ax.grid(axis="x", color="white", lw=1, ls="-") ax.set_title(title, color="black", fontsize=12) line_animation = animation.FuncAnimation(fig, plot_frame, frames=df["date"], interval=int(duration * 1000)) if filename is None: try: from IPython.display import HTML return HTML(line_animation.to_jshtml()) except ImportError: pass else: line_animation.save(filename) return filename dfdata = pd.read_csv('Pop_top3.csv') dfdata = dfdata.rename({"year": "date"}, axis=1) for col in dfdata.columns: if col != "date": dfdata.loc[:, col] = np.round(dfdata.loc[:, col] , 3) dfdata.set_index(dfdata["date"]) html_file = "1996-2022年历年中美全球500企业数量走势对比图.html" html = line_chart_race(dfdata, html_file, title="1996-2022年历年中美全球500企业数量走势对比图") html 输出结果:
需要数据集的家人们可以去百度网盘(永久有效)获取:
链接:https://pan.baidu.com/s/1FmXgepDVpv7c-eYdwPHDYg?pwd=2138
提取码:2138
更多优质内容持续发布中,请移步主页查看。
点赞+关注,下次不迷路!