用Matplotlib画两张花里胡哨的图
作者:小小明
今天要画两张图,分别是:
代码逻辑较为复杂,这次只展示代码。
导包
import matplotlib.pyplot as plt
import matplotlib as mpl
import numpy as np
import pandas as pd
# 解决中文显示问题
mpl.rcParams['font.sans-serif'] = ['SimHei']
mpl.rcParams['axes.unicode_minus'] = False
数据读取
excel = pd.ExcelFile("旅游数据.xlsx")
df_2019 = pd.read_excel(excel, sheet_name=0)
df_2020 = pd.read_excel(excel, sheet_name=1)
df_2019["年份"] = 2019
df_2020["年份"] = 2020
display(df_2019.head())
df_2020['指标名称'].replace('兵团', '新疆兵团', inplace=True)
df_2020.tail()
指标名称 | 代码 | 本季组织人次数 | 本季接待人次数 | 本季组织人天数 | 本季接待人天数 | 年份 | |
---|---|---|---|---|---|---|---|
0 | 北京 | 1 | 1229139 | 811223 | 4841564 | 3654045 | 2019 |
1 | 天津 | 2 | 1108300 | 411033 | 2989315 | 1057598 | 2019 |
2 | 河北 | 3 | 813446 | 343793 | 1991293 | 750916 | 2019 |
3 | 山西 | 4 | 587867 | 555379 | 2066682 | 2218679 | 2019 |
4 | 内蒙古 | 5 | 115648 | 186861 | 461579 | 640426 | 2019 |
指标名称 | 代码 | 本季组织人次数 | 本季接待人次数 | 本季组织人天数 | 本季接待人天数 | 年份 | |
---|---|---|---|---|---|---|---|
27 | 甘肃 | 28 | 83076 | 27911 | 133133 | 64421 | 2020 |
28 | 青海 | 29 | 55968 | 33627 | 65130 | 52868 | 2020 |
29 | 宁夏 | 30 | 47134 | 23854 | 78404 | 35521 | 2020 |
30 | 新疆 | 31 | 38474 | 20079 | 74410 | 33474 | 2020 |
31 | 新疆兵团 | 32 | 25759 | 18005 | 49957 | 39839 | 2020 |
第一张图
plt.style.use('fivethirtyeight')
plt.figure(figsize=(20, 14))
plt.subplot(2, 1, 1)
plt.title("2019与2020年本季组织人次数前十的对比", fontsize=20)
t1 = (df_2019[["指标名称", "本季组织人次数"]].sort_values("本季组织人次数", ascending=False).head(10))
t2 = (df_2020[["指标名称", "本季组织人次数"]].sort_values("本季组织人次数", ascending=False).head(10))
plt.plot(range(10), t1['本季组织人次数'], linewidth=2,label='2019', marker='o', markersize=8)
plt.plot(range(10), t2['本季组织人次数'], linewidth=2,label='2020', marker='s', markersize=8)
plt.fill_between(range(10), t1['本季组织人次数'], t2['本季组织人次数'],color="gray", alpha=0.2, label="area")
plt.legend(['2019', '2020'], fontsize=20)
plt.grid(b=True)
for x, (city, y) in enumerate(t1[["指标名称", "本季组织人次数"]].values):plt.text(x, y, f"{city}:\n{y/10000:.2f}万", fontsize=15,horizontalalignment='center', verticalalignment='center')
for x, (city, y) in enumerate(t2[["指标名称", "本季组织人次数"]].values):plt.text(x, y, f"{city}:\n{y/10000:.2f}万", fontsize=15,horizontalalignment='center', verticalalignment='center')
plt.xticks(range(10), [f"第{i}名" for i in range(1, 11)], fontsize=15)
plt.yticks(range(0, 6500000, 500000), [f"{i//10000}万" for i in range(0, 6500000, 500000)], fontsize=15)plt.subplot(2, 2, 3)
plt.title("2019与2020年四座城市的本季组织人次数对比", fontsize=20)
t1 = df_2019.loc[df_2019["指标名称"].isin(["北京", "天津", "上海", "重庆"]), ["指标名称", "本季组织人次数"]]
t2 = df_2020.loc[df_2020["指标名称"].isin(["北京", "天津", "上海", "重庆"]), ["指标名称", "本季组织人次数"]]
index = np.arange(4)
plt.bar(index, t1['本季组织人次数'], width=0.4, label='2019')
plt.bar(index+0.4, t2['本季组织人次数'], width=0.4, label='2020')
cutoff_postion = t1["本季组织人次数"].reset_index(drop=True).sort_values(ascending=False).index[:2]
x, y = cutoff_postion[0], t1["本季组织人次数"].iat[cutoff_postion[1]]
plt.plot(np.array([-0.2, -0.1, 0.1, 0.2])+x,np.array([0, 1, -1, 0])*y*0.04+y, color="white")plt.legend(fontsize=15)
plt.grid(b=True, axis='y')
plt.xticks(index+0.2, t1['指标名称'], fontsize=15)
plt.yticks(range(0, 4000000, 500000), [f"{i//10000}万" for i in range(0, 4000000, 500000)], fontsize=15)
for x, (y1, y2) in enumerate(zip(t1["本季组织人次数"], t2["本季组织人次数"])):plt.text(x, y1, f"{y1/10000:.2f}万", verticalalignment='bottom',horizontalalignment='center', fontsize=15)plt.text(x+0.4, y2, f"{y2/10000:.2f}万", verticalalignment='bottom',horizontalalignment='center', fontsize=15)plt.subplot(2, 2, 4)
plt.title("2019与2020年四座城市的本季接待人次数对比", fontsize=20)
t1 = df_2019.loc[df_2019["指标名称"].isin(["北京", "天津", "上海", "重庆"]), ["指标名称", "本季接待人次数"]]
t2 = df_2020.loc[df_2020["指标名称"].isin(["北京", "天津", "上海", "重庆"]), ["指标名称", "本季接待人次数"]]
index = np.arange(4)
plt.bar(index, t1['本季接待人次数'], width=0.4, label='2019')
plt.bar(index+0.4, t2['本季接待人次数'], width=0.4, label='2020')
cutoff_postion = t1["本季接待人次数"].reset_index(drop=True).sort_values(ascending=False).index[:2]
x, y = cutoff_postion[0], t1["本季接待人次数"].iat[cutoff_postion[1]]
plt.plot(np.array([-0.2, -0.1, 0.1, 0.2])+x,np.array([0, 1, -1, 0])*y*0.04+y, color="white")plt.legend(fontsize=15)
plt.grid(b=True, axis='y')
plt.xticks(index+0.2, t1['指标名称'], fontsize=15)
plt.yticks(range(0, 3000000, 500000), [f"{i//10000}万" for i in range(0, 3000000, 500000)], fontsize=15)
for x, (y1, y2) in enumerate(zip(t1["本季接待人次数"], t2["本季接待人次数"])):plt.text(x, y1, f"{y1/10000:.2f}万", verticalalignment='bottom',horizontalalignment='center', fontsize=15)plt.text(x+0.4, y2, f"{y2/10000:.2f}万", verticalalignment='bottom',horizontalalignment='center', fontsize=15)
plt.subplots_adjust(wspace=0.1, hspace=0.15)
plt.show()
第二张图
plt.style.use('fivethirtyeight')
plt.figure(figsize=(20, 20))
plt.subplot(3, 2, 1)
df_tmp = pd.concat([df_2019, df_2020]).groupby("年份").sum().drop(columns="代码").T
plt.title("四项指标总和年度对比", fontsize=15)
index = np.arange(4)
plt.bar(index, df_tmp[2019], width=0.4, label='2019')
plt.bar(index+0.4, df_tmp[2020], width=0.4, label='2020')
plt.plot(index+0.4, df_tmp[2020], linewidth=2, color='orange')
plt.legend(title="年份")
plt.grid(b=True)
for x, (y1, y2) in enumerate(df_tmp.values):plt.text(x, y1, f"{y1/1e4:.1f}万", verticalalignment='bottom',horizontalalignment='center')plt.text(x+0.4, y2, f"{y2/1e4:.1f}万", verticalalignment='bottom',horizontalalignment='center')
plt.xticks(index+0.2, df_tmp.index)
plt.yticks(np.arange(0, 1.4e8, 1e7), [f"{i//1e4:.0f}万" for i in np.arange(0, 1.4e8, 1e7)], fontsize=15)plt.subplot(3, 2, 2)
plt.title("中部地带本季组织人次数年度对比", fontsize=15)
df_tmp = pd.concat([df_2019[["指标名称", "本季组织人次数"]].set_index("指标名称"),df_2020[["指标名称", "本季组织人次数"]].set_index("指标名称")], axis=1)
df_tmp.columns = [2019, 2020]
df_tmp = df_tmp.loc[["黑龙江", "吉林", "山西", "内蒙古", "安徽", "河南", "湖北", "湖南", "江西"]]
plt.barh(df_tmp.index, df_tmp[2019], label='2019')
plt.barh(df_tmp.index, -df_tmp[2020], label='2020')
plt.legend(title="年份", loc='lower right')
plt.grid(b=True)
plt.xticks(np.arange(-1e6, 2.7e6, 4e5), [f"{abs(i)//1e4:.0f}万" for i in np.arange(-1e6, 2.7e6, 4e5)], fontsize=15)
for y, (x1, x2) in enumerate(df_tmp.values):plt.text(x1, y, f"{x1/1e4:.1f}万", verticalalignment='center',horizontalalignment='left')plt.text(-x2, y, f"{x2/1e4:.1f}万", verticalalignment='center',horizontalalignment='right')
plt.xlim([-1.1e6, 2.7e6])plt.subplot(3, 2, 3)
df_tmp = pd.concat([df_2019[["指标名称", "本季接待人次数"]].set_index("指标名称"),df_2020[["指标名称", "本季接待人次数"]].set_index("指标名称")], axis=1)
df_tmp.columns = [2019, 2020]
df_tmp.columns.name = "年份"
df_tmp = df_tmp.loc[["辽宁", "河北", "天津", "北京", "山东","江苏", "上海", "浙江", "福建", "广东", "广西", "海南"]]
s = df_tmp[2019]/10000
radius_s = ((s-s.min())/(s.max()-s.min())+0.8).values
wedges, texts1, texts2 = plt.pie(s, # 数据explode=[0.1]*df_tmp.shape[0], # 指定每部分的偏移量labels=df_tmp.index, # 标签autopct="%.2f万", # 饼图上的数据标签显示方式pctdistance=0.6, # 每个饼切片的中心和通过autopct生成的文本开始之间的比例labeldistance=1, # 被画饼标记的直径,默认值:1.1shadow=True, # 阴影startangle=0, # 开始角度radius=1.8, # 半径frame=False, # 图框counterclock=True, # 指定指针方向,顺时针或者逆时针
)
for i, wedge in enumerate(wedges):wedge.set_radius(radius_s[i])
for i, text in enumerate(texts1):text.set_position(tuple(map(lambda x: x*radius_s[i]/1.7, text.get_position())))
for i, text in enumerate(texts2):if radius_s[i] < 0.9:text.set_text("")continuetext.set_position(tuple(map(lambda x: x*radius_s[i]/2, text.get_position())))plt.subplot(3, 2, 4)
# plt.title("2020年东部沿海地带本季接待人次数", fontsize=15)
s = df_tmp[2020]/10000
radius_s = ((s-s.min())/(s.max()-s.min())+0.8).values
wedges, texts1, texts2 = plt.pie(s, # 数据explode=[0.1]*df_tmp.shape[0], # 指定每部分的偏移量labels=df_tmp.index, # 标签autopct="%.2f万", # 饼图上的数据标签显示方式pctdistance=0.6, # 每个饼切片的中心和通过autopct生成的文本开始之间的比例labeldistance=1, # 被画饼标记的直径,默认值:1.1shadow=True, # 阴影startangle=0, # 开始角度radius=1.8, # 半径frame=False, # 图框counterclock=True, # 指定指针方向,顺时针或者逆时针
)
for i, wedge in enumerate(wedges):wedge.set_radius(radius_s[i])
for i, text in enumerate(texts1):if radius_s[i] < 0.83:text.set_text("")continuetext.set_position(tuple(map(lambda x: x*radius_s[i]/1.7, text.get_position())))
for i, text in enumerate(texts2):if radius_s[i] < 0.87:text.set_text("")continuetext.set_position(tuple(map(lambda x: x*radius_s[i]/2, text.get_position())))plt.subplot(3, 1, 3)
plt.title("西部地带本季接待人天数气泡图", fontsize=15)
df_tmp = pd.concat([df_2019[["指标名称", "本季接待人天数"]].set_index("指标名称"),df_2020[["指标名称", "本季接待人天数"]].set_index("指标名称")], axis=1)
df_tmp.columns = [2019, 2020]
df_tmp.columns.name = "年份"
df_tmp = df_tmp.loc[["陕西", "甘肃", "宁夏", "青海","新疆", "重庆", "四川", "云南", "贵州", "西藏"]]
index = range(df_tmp.shape[0])
plt.scatter(index,[2]*df_tmp.shape[0], # 按照经纬度显示s=df_tmp[2019] / 1000, # 按照单价显示大小c=range(df_tmp.shape[0]), # 按照总价显示颜色alpha=0.6,cmap="jet",
)
plt.scatter(index,[1]*df_tmp.shape[0], # 按照经纬度显示s=df_tmp[2020] / 1000, # 按照单价显示大小c=range(df_tmp.shape[0]), # 按照总价显示颜色alpha=0.6,cmap="jet",
)
for i, (v1, v2) in enumerate(df_tmp.values):plt.text(i, 2, f"{v1/10000:.0f}万", verticalalignment='center',horizontalalignment='center', fontsize=15)plt.text(i, 1, f"{v2/10000:.0f}万", verticalalignment='bottom',horizontalalignment='center', fontsize=15)
plt.xticks(index, df_tmp.index)
plt.yticks([1, 2], [2020, 2019])
plt.ylim([0.5, 2.5])plt.subplots_adjust(wspace=0.1, hspace=0.4)
plt.show()
用Matplotlib画两张花里胡哨的图相关推荐
- python matplotlib画多个图_python matplotlib模块 如何画两张图出来
展开全部 python matplotlib模块 如何画两张图出2113来的方法:5261 代码如下所示: import numpy as np import matplotlib.pyplot as ...
- python怎么画多重饼状图_Python通过matplotlib画双层饼图及环形图简单示例
(1) 饼图(pie),即在一个圆圈内分成几块,显示不同数据系列的占比大小,这也是我们在日常数据的图形展示中最常用的图形之一. 在python中常用matplotlib的pie来绘制,基本命令如下所示 ...
- python画环形图_Python通过matplotlib画双层饼图及环形图简单示例
摘要:这篇Python开发技术栏目下的"Python通过matplotlib画双层饼图及环形图简单示例",介绍的技术点是"matplotlib.Python.简单示例.饼 ...
- python绘制饼图双层_Python通过matplotlib画双层饼图及环形图简单示例
(1) 饼图(pie),即在一个圆圈内分成几块,显示不同数据系列的占比大小,这也是我们在日常数据的图形展示中最常用的图形之一. 在python中常用matplotlib的pie来绘制,基本命令如下所示 ...
- matlab仿真图同时画两张,matlab怎么把两个图放在一起
1.matlab怎么把两个图放在一起 MATLAB中有hold on和hold off指令,在Command Window中使用可以实现同时让两个图出现在一起. hold on的意思是打印的图形会叠加 ...
- 使用pandas同时画两个箱线图
pandas 画箱线图 测试文件:https://codechina.csdn.net/u014467816/ktools/-/blob/master/%E4%B8%A4%E4%B8%AA%E7%AE ...
- 两张思维导图,让你轻松学习数据结构
前段时间打算重新温习一下数据结构,整理一些新的内容,在网上搜到了很多受用的精彩博客,可以说受益匪浅."前人栽树,后人乘凉"已然石锤了. 先亮出第一张思维导图: 数据结构思维导图- ...
- python怎么画两张图_python中如何用subplot画多个子图?
开始讲今天的内容之前,先说一点题外话.上学的时候地理课上会画一些等高图.小地图之类的,那时候小编就对地理产生了浓厚的兴趣,不过最后因为种种原因还是没有选择继续学习地理方面的知识了.接触了python之 ...
- excle2010 一张图上画两种类型的图:折线图+柱形图
step1:将三列数据选定,插入折线图: 这时,会出现一个X轴下,两条折线: step2:选择其中一条折线,右键"更改系列图形列表",然后选择柱形图: 这时,会出现一个X轴下,一条 ...
- matplotlib—画正弦、余弦函数图
一.导入模块 import matplotlib.pyplot as plt import numpy as np plt.rcParams['font.sans-serif']=['SimHei'] ...
最新文章
- CreateProcess failed: The system cannot find the file specified.
- hdu2276 矩阵构造
- 用户认证-什么是认证
- SolrCloud7.4(Jetty容器)+mysql oracle 部署与应用
- SAP Cloud for Customer Account和individual customer的区别
- osg多视景器实现投影墙
- 面向对象设计必须学习的三层应用程序模型
- Windows/Mac系统MySQL,MySQL驱动下载和安装
- 开机需要手动启动无线
- 视觉SLAM十四讲学习笔记——第八讲 视觉里程计(3)
- 计算机美食网页毕业论文,毕业论文--美食网页计与制作.doc
- java学籍管理系统部分代码_java学籍管理系统源代码
- 陈风莲(帮别人名字作诗)
- 上海率先开放政府数据 医院床位车位信息均可查
- 白小小的可爱伤感空间日志发布:有些人,注定只是过客
- 使用 tf.nn.dynamic_rnn 展开时间维度
- 众多快递中驿站代收的单号怎么查询、筛选的
- Swin-Transformer网络结构详解
- 台式计算机32位和64位的区别,电脑操作系统中32位和64位到底有哪些区别?
- 【信息技术学考】2021年深圳市高中学业水平考试卷(解析版)
热门文章
- 联想Y470 非虚拟机安装苹果Mac OS X Mavericks 10.9.1教程详解(文字+图片),通俗易懂亲自动手——序列三之安装过程,设置选项
- 物联网 PaaS 平台大盘点
- PHP所支持的时区列表
- php 读取图片bgr,快速解决cv2.imread()读取图像为BGR的问题
- 机器学习——支持向量机support vector machine
- 强烈推荐:C#编码规范手册
- Pycharm配置(1)——解释器(interpreter)
- 降钙素(Cys(Acm)²·⁷)-α-CGRP (human)、125448-83-1
- elementUI表格合并单元格详解
- 服务器做虚拟网吧,一种基于游戏的虚拟网吧实现方法