作者:小小明

今天要画两张图,分别是:

代码逻辑较为复杂,这次只展示代码。

导包

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画两张花里胡哨的图相关推荐

  1. python matplotlib画多个图_python matplotlib模块 如何画两张图出来

    展开全部 python matplotlib模块 如何画两张图出2113来的方法:5261 代码如下所示: import numpy as np import matplotlib.pyplot as ...

  2. python怎么画多重饼状图_Python通过matplotlib画双层饼图及环形图简单示例

    (1) 饼图(pie),即在一个圆圈内分成几块,显示不同数据系列的占比大小,这也是我们在日常数据的图形展示中最常用的图形之一. 在python中常用matplotlib的pie来绘制,基本命令如下所示 ...

  3. python画环形图_Python通过matplotlib画双层饼图及环形图简单示例

    摘要:这篇Python开发技术栏目下的"Python通过matplotlib画双层饼图及环形图简单示例",介绍的技术点是"matplotlib.Python.简单示例.饼 ...

  4. python绘制饼图双层_Python通过matplotlib画双层饼图及环形图简单示例

    (1) 饼图(pie),即在一个圆圈内分成几块,显示不同数据系列的占比大小,这也是我们在日常数据的图形展示中最常用的图形之一. 在python中常用matplotlib的pie来绘制,基本命令如下所示 ...

  5. matlab仿真图同时画两张,matlab怎么把两个图放在一起

    1.matlab怎么把两个图放在一起 MATLAB中有hold on和hold off指令,在Command Window中使用可以实现同时让两个图出现在一起. hold on的意思是打印的图形会叠加 ...

  6. 使用pandas同时画两个箱线图

    pandas 画箱线图 测试文件:https://codechina.csdn.net/u014467816/ktools/-/blob/master/%E4%B8%A4%E4%B8%AA%E7%AE ...

  7. 两张思维导图,让你轻松学习数据结构

    ​前段时间打算重新温习一下数据结构,整理一些新的内容,在网上搜到了很多受用的精彩博客,可以说受益匪浅."前人栽树,后人乘凉"已然石锤了. 先亮出第一张思维导图: 数据结构思维导图- ...

  8. python怎么画两张图_python中如何用subplot画多个子图?

    开始讲今天的内容之前,先说一点题外话.上学的时候地理课上会画一些等高图.小地图之类的,那时候小编就对地理产生了浓厚的兴趣,不过最后因为种种原因还是没有选择继续学习地理方面的知识了.接触了python之 ...

  9. excle2010 一张图上画两种类型的图:折线图+柱形图

    step1:将三列数据选定,插入折线图: 这时,会出现一个X轴下,两条折线: step2:选择其中一条折线,右键"更改系列图形列表",然后选择柱形图: 这时,会出现一个X轴下,一条 ...

  10. matplotlib—画正弦、余弦函数图

    一.导入模块 import matplotlib.pyplot as plt import numpy as np plt.rcParams['font.sans-serif']=['SimHei'] ...

最新文章

  1. CreateProcess failed: The system cannot find the file specified.
  2. hdu2276 矩阵构造
  3. 用户认证-什么是认证
  4. SolrCloud7.4(Jetty容器)+mysql oracle 部署与应用
  5. SAP Cloud for Customer Account和individual customer的区别
  6. osg多视景器实现投影墙
  7. 面向对象设计必须学习的三层应用程序模型
  8. Windows/Mac系统MySQL,MySQL驱动下载和安装
  9. 开机需要手动启动无线
  10. 视觉SLAM十四讲学习笔记——第八讲 视觉里程计(3)
  11. 计算机美食网页毕业论文,毕业论文--美食网页计与制作.doc
  12. java学籍管理系统部分代码_java学籍管理系统源代码
  13. 陈风莲(帮别人名字作诗)
  14. 上海率先开放政府数据 医院床位车位信息均可查
  15. 白小小的可爱伤感空间日志发布:有些人,注定只是过客
  16. 使用 tf.nn.dynamic_rnn 展开时间维度
  17. 众多快递中驿站代收的单号怎么查询、筛选的
  18. Swin-Transformer网络结构详解
  19. 台式计算机32位和64位的区别,电脑操作系统中32位和64位到底有哪些区别?
  20. 【信息技术学考】2021年深圳市高中学业水平考试卷(解析版)

热门文章

  1. 联想Y470 非虚拟机安装苹果Mac OS X Mavericks 10.9.1教程详解(文字+图片),通俗易懂亲自动手——序列三之安装过程,设置选项
  2. 物联网 PaaS 平台大盘点
  3. PHP所支持的时区列表
  4. php 读取图片bgr,快速解决cv2.imread()读取图像为BGR的问题
  5. 机器学习——支持向量机support vector machine
  6. 强烈推荐:C#编码规范手册
  7. Pycharm配置(1)——解释器(interpreter)
  8. 降钙素(Cys(Acm)²·⁷)-α-CGRP (human)、125448-83-1
  9. elementUI表格合并单元格详解
  10. 服务器做虚拟网吧,一种基于游戏的虚拟网吧实现方法