Python数据可视化-黑马程序员 案例实现

学习数据可视化时,对这本书上的案例的实现,代码都在Jupyter Lab上运行过


目录

第一章 数据可视化与matplotlib

第二章 使用matplotlib绘制简单图表

实例1:未来15天最高气温和最低气温

实例2:2013~2019财年阿里巴巴淘宝和天猫平台的GMV

实例3:各商品种类的网购替代率

第三章 图表辅助元素的定制

实例1:2019年内地电影票房排行榜

实例2:支付宝月账单报告

实例3:汽车速度与制动距离的关系(添加网格)

实例4:全校高二年级各班男女生英语成绩评估 

实例5::阿里巴巴淘宝和天猫平台的GMV(添加注释文本) 

实例6:果酱面包配料比例

第四章 图表样式美化

实例1:两个地区对不同种类图书的采购情况

实例2::国际外汇市场美元/人民币汇率走势

实例3:标记不同产品各季度的销售额

实例4:未来15天最高气温和最低气温(设置字体样式)

实例5:彩色的“雪花”

第五章 子图绘制及坐标轴共享

实例1:某工厂产品A与产品B去年的销售额分析

实例2:部分国家养猫与养狗人群比例分析

实例3:2017年与2018年抖音用户分析

实例4:某地区全年气温和水量的关系

实例5:2018上半年某品牌汽车销售情况

 第六章 坐标轴的定制

实例1:深圳市24小时的平均风速

实例2:深圳市24小时的平均风速

实例3:正弦与余弦曲线

第七章 绘制3D图表和统计地图

实例1:三维空间的星星

实例2:三维空间闪烁的星星

实例3:美国部分城镇人口分布

实例4:绘制3D柱形图

第八章 使用matplotlib绘制高级图表

实例一 绘制等高线图

实例二 绘制矢量场流线图

实例三 绘制棉棒图

实例四 绘制哑铃图

实例五 绘制甘特图

实例六 绘制人口金字塔

实例七 绘制漏斗图

实例八 绘制桑基图 

实例九 绘制树状图

实例十 绘制华夫饼图

第九章 Pyecharts

1 绘制折线图

2 绘制饼图或圆环图

3 绘制散点图

4 绘制3D柱形图

5 绘制统计地图

6 绘制漏斗图

7 绘制桑基图

8 并行多图

9 顺序多图

10 选项卡多图

11 时间线轮播多图

12 虎扑社区



第一章 数据可视化与matplotlib

1、安装matplotlib

在Anaconda Prompt中运行以下代码

pip install matplotlib

2、编写程序,绘制正弦曲线和余弦曲线

import matplotlib.pyplot as plt
import numpy as np

# 定义 x 的范围
x = np.linspace(0, 2 * np.pi, 100)

# 计算 sin 和 cos 的值
y_sin = np.sin(x)
y_cos = np.cos(x)

# 创建图形
plt.figure(figsize=(8, 6))
plt.plot(x, y_sin, label='sin(x)', color='blue')
plt.plot(x, y_cos, label='cos(x)', color='red')

# 添加标题和标签
plt.title('Sine and Cosine Functions')
plt.xlabel('x')
plt.ylabel('y')
plt.legend()

# 显示网格和图形
plt.grid(True)
plt.show()

3、从matplotlib网站中找3个案例并仿照编写运行

import matplotlib.pyplot as plt

data = {'apple': 10, 'orange': 15, 'lemon': 5, 'lime': 20}
names = list(data.keys())
values = list(data.values())

fig, axs = plt.subplots(1, 3, figsize=(9, 3), sharey=True)
axs[0].bar(names, values)
axs[1].scatter(names, values)
axs[2].plot(names, values)
fig.suptitle('Categorical Plotting')

第二章 使用matplotlib绘制简单图表

实例1:未来15天最高气温和最低气温

本实例要求根据下表的数据,将日期列的数据作为x轴数据,将最高气温和最低气温两列的数据作为y轴数据,使用plot()函数绘制下图所示的折线图

import matplotlib.pyplot as plt
import numpy as np

#4 5 6 ... 18
x = np.arange(4, 19)
y_max = np.array([32, 33, 34, 34, 31, 30, 29, 30, 29, 26, 23, 21, 25, 31, 13])
y_min = np.array([19, 19, 20, 22, 21, 22, 16, 18, 18, 17, 14, 15, 16, 16, 13])

# 绘制折线图
plt.plot(x, y_max)
plt.plot(x, y_min)
plt.show()

实例2:2013~2019财年阿里巴巴淘宝和天猫平台的GMV

本实例要求根据下表的数据,将财年列的数据作为x轴数据,将GMV列的数据作为y轴数据,使用bar()函数绘制下图所示的柱形图

import matplotlib.pyplot as plt
import numpy as np

x = np.arange(1, 8)
y = np.array([10770, 16780, 24440, 30920, 37670, 48200, 57270])

# 绘制柱形图
plt.bar(x, y, tick_label=["FY2013", "FY2014", "FY2015", "FY2016", "FY2017", "FY2018", "FY2019"], width=0.5)
plt.show()

 

 实例3:各商品种类的网购替代率

本实例要求根据下表的数据,将商品种类列的数据作为y轴的刻度标签,将替代率列的数据作为x轴数据,使用barh()函数绘制下图所示的条形图

import matplotlib.pyplot as plt
import numpy as np

# 显示中文
plt.rcParams['font.sans-serif'] = ['SimHei']  # 使用黑体字体
plt.rcParams['axes.unicode_minus'] = False  # 解决负号显示问题

x = np.array([0.959, 0.951, 0.935, 0.924, 0.893,
              0.892, 0.865, 0.863, 0.860, 0.856,
              0.854, 0.835, 0.826, 0.816, 0.798,
              0.763, 0.763, 0.671])

y = np.arange(1, 19)

labels = [ "家教", "保姆等生活服务", "飞机票", "家具", "手机、手机配件", 
          "计算机及其配套产品", "汽车用品", "电话充值、游戏充值", "个人护理用品", 
          "报杂志及音像制品", "餐饮、旅游、住宿", "家用电器", "食品、饮料、烟酒", 
          "保险", "演出服务", "服装、鞋帽、家用纺织品", "数码产品", "工艺品、收藏品"]

# 绘制条形图
plt.barh(y, x, tick_label=labels, align="center", height=0.6)
plt.show()

第三章 图表辅助元素的定制

实例1:2019年内地电影票房排行榜

本实例要求根据下表的数据,将电影名称列的数据作为y轴的刻度标签 ,将总票房(亿元)列的数据作为条形数据,使用barh()函数绘制下图所示的条形图,并设置坐标轴标签刻度标签

import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams["axes.unicode_minus"] = False
labels = [" 哪吒之魔童降世 ", " 流浪地球 ", " 复仇者联盟 4: 终局之战 ",
          " 疯狂的外星人 ", " 飞驰人生 ", " 烈火英雄 ", " 蜘蛛侠 : 英雄远征 ", 
          " 速度与激情 : 特别行动 ", " 扫毒 2 : 天地对决 ", " 大黄蜂 "," 惊奇队长 ",
          " 比悲伤更悲伤的故事 ", " 哥斯拉 2: 怪兽之王 ", " 阿丽塔 : 战斗天使 ",
          " 银河补习班 "]
bar_width = [48.57, 46.18, 42.05, 21.83, 17.03, 16.70, 14.01, 13.84, 
             12.85, 11.38, 10.25, 9.46, 9.27, 8.88, 8.64]
y_data = range(len(labels))
fig = plt.figure()
ax = fig.add_subplot(111)
ax.barh(y_data, bar_width, height=0.2, color='orange') 
# 设置 x 轴和 y 轴的标签
ax.set_xlabel(" 总票房 ( 亿元 )")
ax.set_ylabel(" 电影名称 ")
# 设置 y 轴的刻度线位置、 刻度标签
ax.set_yticks(y_data)
ax.set_yticklabels(labels)
plt.show()

 

实例2:支付宝月账单报告

本实例要求饼图中所有的标注文字移动到图例中,以图例的形式来标注每个扇形代表的含义,使饼图显得更加简洁。

import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
kinds = ['购物', '人情往来', '餐饮美食', '通信物流', '生活日用', '交通出行', '休闲娱乐', '其他']
money_scale = [800 / 3000, 100 / 3000, 1000 / 3000, 200 / 3000, 300 / 3000, 200 / 3000, 200 / 3000, 200 / 3000]
dev_position = [0.1] * len(kinds)
plt.pie(money_scale, labels=kinds, autopct='%3.1f%%', shadow=True, explode=dev_position, startangle=90)
plt.title('支付宝月账单报告')
plt.legend(kinds, loc='upper right', bbox_to_anchor=(1.3, 1.1))
plt.show()

 

实例3:汽车速度与制动距离的关系(添加网格)

本实例要求对上面的散点图进行调整,显示图表的垂直网格与水平网格,并为图表增加x轴和y轴的标签,明确图表中各圆点对应的数值与含义。

# 准备 x 轴和 y 轴的数据
x_speed = np.arange(10, 210, 10)
y_distance = np.array([10.5, 2.0, 4.4, 7.9, 12.3,
                       17.7, 24.1, 31.5, 39.9, 49.2,
                       59.5, 70.8, 83.1, 96.4, 110.7,
                       126.0, 142.2, 159.4, 177.6, 196.8])

# 绘制散点图
# s指定数据点的大小 alpha指定透明度
plt.scatter(x_speed, y_distance, s=50, alpha=0.9)
plt.grid(linewidth=0.3)
plt.show()

实例4:全校高二年级各班男女生英语成绩评估 

本实例要求根据下表的数据,绘制展示各班男生、女生英语平均成绩的柱形图,并将全体高二年级的英语平均成绩绘制成参考线

 

import numpy as np  
import matplotlib.pyplot as plt  
  
# 设置matplotlib以支持中文显示  
plt.rcParams['font.sans-serif'] = ['SimHei']  
plt.rcParams['axes.unicode_minus'] = False  
  
men_means = (90.5, 89.5, 88.7, 88.5, 85.2, 86.6)  
women_means = (92.7, 87.0, 90.5, 85.0, 89.5, 89.8)  
ind = np.arange(len(men_means))  # 每组柱形的 x 位置  
width = 0.2  # 各柱形的宽度  
  
fig = plt.figure()  
ax = fig.add_subplot(111)  
  
# 绘制男生平均成绩的柱状图  
ax.bar(ind - width / 2, men_means, width, label='男生平均成绩')  
# 绘制女生平均成绩的柱状图,注意x位置偏移  
ax.bar(ind + width / 2, women_means, width, label='女生平均成绩')  
  
# 设置图表标题和坐标轴标签  
ax.set_title('高二各班男生、女生英语平均成绩')  
ax.set_ylabel('分数')  
  
# 设置x轴刻度标签  
ax.set_xticks(ind)  
ax.set_xticklabels(['高二 1 班', '高二 2 班', '高二 3 班', '高二 4 班',   
                    '高二 5 班', '高二 6 班'])  
  
# 添加参考线  
ax.axhline(88.5, ls='--', linewidth=1.0, label='全体平均成绩')  
  
# 显示图例  
ax.legend(loc="lower right")  
  
# 显示图形  
plt.show()

实例5: 阿里巴巴淘宝和天猫平台的GMV(添加注释文本) 

 本实例要求对前面的柱形图进行调整,在每个柱形的顶部添加无指向型注释文本,并设置y轴的标签。

import numpy as np  
import matplotlib.pyplot as plt  
  
# 设置字体以支持中文  
plt.rcParams['font.sans-serif'] = ['SimHei']  
plt.rcParams['axes.unicode_minus'] = False  
  
# 定义x轴(年份)和y轴(GMV)的数据  
x = np.arange(1, 8)  
y = np.array([10770, 16780, 24440, 30920, 37670, 48200, 57270])  
  
# 绘制条形图  
bar_rects = plt.bar(x, y, tick_label=["FY2013", "FY2014", "FY2015", "FY2016", "FY2017", "FY2018", "FY2019"], width=0.5)  
  
# 添加无指向型注释文本  
def autolabel(rects):  
    """在每个矩形条的上方附加一个文本标签,以显示其高度"""  
    for rect in rects:  
        height = rect.get_height()  # 获取每个矩形条的高度  
        plt.text(rect.get_x() + rect.get_width() / 2, height + 3,  # 调整文本位置以避免重叠  
                 '{}'.format(height),  
                 ha='center', va='bottom')  
  
autolabel(bar_rects)  
  
# 设置y轴标签  
plt.ylabel('GMV(亿元)')  
  
# 显示图表  
plt.show()

实例6:果酱面包配料比例

本实例要求根据下表的数据,将配料名称列的数据作为图例项,将重量列的数据与总重量的比例作为数据,使用pie()绘制果酱面包配料比例的饼图,并将各种配料的重量以数据表格的形式添加到图表中,方便用户了解各种配料的占比和重量。

import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
kinds = [' 面粉 ', ' 全麦粉 ', ' 酵母 ', ' 苹果酱 ', ' 鸡蛋 ', ' 黄油 ', ' 盐 ', ' 白糖 ']
weight = [250, 150, 4, 250, 50, 30, 4, 20]
total_weight = 0
for i in weight:
    total_weight += i
batching_scale = [i / total_weight for i in weight]
plt.pie(batching_scale, autopct='%3.1f%%')
plt.legend(kinds, loc='upper right', bbox_to_anchor=[1.1, 1.1]) 
# 添加表格
plt.table(cellText=[weight], cellLoc='center', rowLabels=[' 重量 (g)'], colLabels=kinds, loc='lower center')
plt.show()

第四章 图表样式美化

实例1:两个地区对不同种类图书的采购情况

本实例要求根据下表的数据,绘制反映地区1和地区2对各类图书采购情况的堆积柱形图,并分别使用“#FFCC00”和“#B0C4DE”这两种颜色进行区分。

import numpy as np
import matplotlib.pyplot as plt
plt.rcParams["font.sans-serif"] = ["SimHei"]
plt.rcParams["axes.unicode_minus"] = False
x = np.arange(5)
y1 = [1200, 2400, 1800, 2200, 1600]
y2 = [1050, 2100, 1300, 1600, 1340]
bar_width = 0.6
tick_label = [" 家庭 ", " 小说 ", " 心理 ", " 科技 ", " 儿童 "]
fig = plt.figure()
ax = fig.add_subplot(111)
# 绘制柱形图 , 并使用颜色
ax.bar(x, y1, bar_width, color="#FFCC00", align="center",label=" 地区 1")
ax.bar(x, y2, bar_width, bottom=y1, color="#B0C4DE", align="center",label=" 地区 2")
ax.set_ylabel(" 采购数量 ( 本 )")
ax.set_xlabel(" 图书种类 ")
ax.set_title(" 地区 1 和地区 2 对各类图书的采购情况 ")
ax.grid(True, axis='y', color="gray", alpha=0.2)
ax.set_xticks(x)
ax.set_xticklabels(tick_label)
ax.legend()
plt.show()

实例2: 国际外汇市场美元/人民币汇率走势

本实例要求根据下表的数据,将日期列的数据作为x轴的刻度范围,将2017年汇率和2019年汇率两列的数据作为y轴的数据,绘制反映2017年7月与2019年7月美元/人民币汇率走势的折线图,并使用实线和长虚线进行区分。

import numpy as np
import matplotlib.pyplot as plt
plt.rcParams["font.sans-serif"] = ["SimHei"]
plt.rcParams["axes.unicode_minus"] = False
# 汇率
eurcny_2017 = np.array([6.8007, 6.8007, 6.8015, 6.8015, 6.8060, 
                        6.8060, 6.8060, 6.8036, 6.8025, 6.7877, 
                        6.7835, 6.7758, 6.7700, 6.7463, 6.7519,
                        6.7511, 6.7511, 6.7539, 6.7265])
eurcny_2019 = np.array([6.8640, 6.8705, 6.8697, 6.8697, 6.8697,
                        6.8881, 6.8853, 6.8856, 6.8677, 6.8662,
                        6.8662, 6.8662, 6.8827, 6.8761, 6.8635,
                        6.8860, 6.8737, 6.8796, 6.8841])
date_x = np.array([3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 
                   13, 14, 17, 18, 19, 24, 25, 26, 31])
fig = plt.figure()
ax = fig.add_subplot(111)
# 第 1 条折线 : 湖绿色 , 实线 , 线宽为 2
ax.plot(date_x, eurcny_2017, color='#006374', linewidth=2,label='2017 年 7 月美元 / 人民币汇率 ')
# 第 2 条折线 : 紫色 , 长虚线 , 线宽为 2
ax.plot(date_x, eurcny_2019, color='#8a2e76', linestyle='--', linewidth=2, label='2019 年 7 月美元 / 人民币汇率 ')
ax.set_title('2017 年 7 月与 2019 年 7 月美元 / 人民币汇率走势 ')
ax.set_xlabel(' 日期 ')
ax.set_ylabel(' 汇率 ')
ax.legend()
plt.show()

实例3:标记不同产品各季度的销售额

本实例要求根据下表的数据,将季度列的数据作为x轴的刻度标签,将产品A、产品B、产品C这三列的数据作为y轴的数据,使用plot()函数绘制反映产品A、产品B和产品C各季度销售额的折线图,并使用不同的线型、颜色、标记进行区分。

import numpy as np
import matplotlib.pyplot as plt
plt.rcParams["font.sans-serif"] = ["SimHei"]
plt.rcParams["axes.unicode_minus"] = False
sale_a = [2144, 4617, 7674, 6666]
sale_b = [853, 1214, 2414, 4409]
sale_c = [153, 155, 292, 680]
fig = plt.figure()
ax = fig.add_subplot(111)
# 绘制具有不同线条样式的折线图
ax.plot(sale_a, 'D-', sale_b, '^:', sale_c, 's--')
ax.grid(alpha=0.3)
ax.set_ylabel(' 销售额 ( 万元 )')
ax.set_xticks(np.arange(len(sale_c)))
ax.set_xticklabels([' 第 1 季度 ',' 第 2 季度 ', ' 第 3 季度 ', ' 第 4 季度 '])
ax.legend([' 产品 A',' 产品 B',' 产品 C'])
plt.show()

实例4:未来15天最高气温和最低气温(设置字体样式)

本实例要求对前面的折线图进行调整,为该图中的折线添加数据标记和注释文本,并设置注释文本的字体样式 。

import matplotlib.pyplot as plt
import numpy as np
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
x = np.arange(4, 19)
y_max =[32, 33, 34, 34, 33, 31, 30, 29, 30, 29, 26, 23, 21, 25, 31]
y_min = [19, 19, 20, 22, 22, 21, 22, 16, 18, 18, 17, 14, 15, 16, 16]
# 可以多次调用 plot() 函数
plt.plot(x, y_max, marker='o', label=' 最高温度 ')
plt.plot(x, y_min, marker='o', label=' 最低温度 ')
# 为图表添加注释并设置字体的样式
x_temp = 4
for y_h, y_l in zip(y_max, y_min):
    plt.text(x_temp-0.3, y_h + 0.7, y_h, family='SimHei', fontsize=8, fontstyle='normal')
    plt.text(x_temp-0.3, y_l + 0.7, y_l, family='SimHei', fontsize=8, fontstyle='normal')
    x_temp += 1
plt.title(' 未来 15 天最高气温和最低气温的走势 ')
plt.xlabel(' 日期 ')
plt.ylabel(r'温度($^\circ$C)')
plt.ylim(0, 40)
plt.legend()
plt.show()

实例5:彩色的“雪花”

雪花一般呈六角形,且通体为白色。本实例要求使用matplotlib绘制一个由多个六角形组成的雪花形状的多边形,并将该多边形填充为浅橙色 。

import numpy as np
import matplotlib.pyplot as plt
def koch_snowflake(order, scale=10):
    def _koch_snowflake_complex(order):
        if order == 0:
            # 初始三角形
            angles = np.array([0, 120, 240]) + 90
            return scale / np.sqrt(3) * np.exp(np.deg2rad(angles) * 1j)
        else:
            ZR = 0.5 - 0.5j * np.sqrt(3) / 3
            p1 = _koch_snowflake_complex(order - 1) # 起点
            p2 = np.roll(p1, shift=-1) # 终点
            dp = p2 - p1 # 连接向量
            new_points = np.empty(len(p1) * 4, dtype=np.complex128)
            new_points[::4] = p1
            new_points[1::4] = p1 + dp / 3
            new_points[2::4] = p1 + dp * ZR
            new_points[3::4] = p1 + dp / 3 * 2
            return new_points
    points = _koch_snowflake_complex(order)
    x, y = points.real, points.imag
    return x, y
x, y = koch_snowflake(order=2)
fig = plt.figure()
ax = fig.add_subplot(111)
ax.fill(x, y, facecolor='lightsalmon', edgecolor='orangered', linewidth=3)
plt.show()

第五章 子图绘制及坐标轴共享

实例1:某工厂产品A与产品B去年的销售额分析

本实例要求根据下表的数据,先将画布规划成2*1的矩阵区域,并在索引为1的区域中绘制反映产品A和产品B销售额趋势的折线图;再将画布规划成2*2的矩阵区域,并在索引为3的区域中绘制反映产品A销售额占比的饼图;最后将画布规划成2*2的矩阵区域,并在索引为4的区域中绘制反映产品B销售额占比的饼图

%matplotlib inline
import numpy as np
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ["SimHei"]
x = [x for x in range(1, 13)]
y1 = [20, 28, 23, 16, 29, 36, 39, 33, 31, 19, 21, 25]
y2 = [17, 22, 39, 26, 35, 23, 25, 27, 29, 38, 28, 20]
labels = ['1 月', '2 月', '3 月', '4 月', '5 月', '6 月', '7月', '8 月', '9 月', '10 月', '11 月', '12 月']

# 将画布规划成等分布局的2×1的矩阵区域 , 之后在索引为1的区域中绘制子图
ax1 = plt.subplot(211)
ax1.plot(x, y1, 'm--o', lw=2, ms=5, label='产品A')
ax1.plot(x, y2, 'g--o', lw=2, ms=5, label='产品B')
ax1.set_title("产品A 与产品B的销售额", fontsize=11)
ax1.set_ylim(10, 45)
ax1.set_ylabel('销售额(亿元)')
ax1.set_xlabel('月份')
for xy1 in zip(x, y1):
    ax1.annotate("%s" % xy1[1], xy=xy1, xytext=(-5, 5), textcoords='offset points')
for xy2 in zip(x, y2):
    ax1.annotate("%s" % xy2[1], xy=xy2, xytext=(-5, 5), textcoords='offset points')
ax1.legend()

# 将画布规划成等分布局的2×2的矩阵区域 , 之后在索引为3的区域中绘制子图
ax2 = plt.subplot(223)
ax2.pie(y1, radius=1, wedgeprops={'width':0.5}, labels=labels, autopct='%3.1f%%', pctdistance=0.75)
ax2.set_title('产品A的销售额 ')

# 将画布规划成等分布局的2×2的矩阵区域 , 之后在索引为4的区域中绘制子图
ax3 = plt.subplot(224)
ax3.pie(y2, radius=1, wedgeprops={'width':0.5}, labels=labels,autopct='%3.1f%%', pctdistance=0.75)
ax3.set_title('产品B的销售额 ')

# 调整子图之间的距离
plt.tight_layout()
plt.show()

实例2:部分国家养猫与养狗人群比例分析

本实例要求根据下表的数据,将整个画布规划成1*2的矩阵区域,并在索引为1和索引为2的区域中分别绘制反映养猫人群比例与养狗人群比例的条形图

%matplotlib inline
import numpy as np
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ["SimHei"]

# 添加无指向型注释文本
def autolabel(ax, rects):
    """ 在每个矩形条的上方附加一个文本标签, 以显示其高度"""
    for rect in rects:
        width = rect.get_width()    #  获取每个矩形条的高度
        ax.text(width  + 3, rect.get_y() , s='{}'.format(width), ha='center', va='bottom')
y = np.arange(12)
x1 = np.array([19, 33, 28, 29, 14, 24, 57, 6, 26, 15, 27, 39])
x2 = np.array([25, 33, 58, 39, 15, 64, 29, 23, 22, 11, 27, 50])
labels = np.array(['中国', '加拿大', '巴西', '澳大利亚', '日本', '墨西哥', 
                   '俄罗斯', '韩国', '瑞士', '土耳其', '英国', '美国'])

# 将画布规划为1×2的矩阵区域 , 依次在每个区域中绘制子图
fig, (ax1, ax2) = plt.subplots(1, 2)
barh1_rects = ax1.barh(y, x1, height=0.5, tick_label=labels, color='#FFA500')
ax1.set_xlabel('人群比例(%)')
ax1.set_title('部分国家养猫人群的比例')
ax1.set_xlim(0, x1.max() + 10)
autolabel(ax1, barh1_rects)
barh2_rects = ax2.barh(y, x2, height=0.5, tick_label=labels, color='#20B2AA')
ax2.set_xlabel('人群比例(%)')
ax2.set_title('部分国家养狗人群的比例')
ax2.set_xlim(0, x2.max() + 10)
autolabel(ax2, barh2_rects)

# 调整子图之间的距离
plt.tight_layout()
plt.show()

实例3:2017年与2018年抖音用户分析

本实例要求根据下表的数据,使用3个子图进行展示:在0~1行第0~1列的区域中,绘制说明2018年相比于2017年人群增长倍数的柱形图;在2行第02行第1列的区域中,分别绘制说明20172018抖音用户地区分布比例饼图

%matplotlib inline

import numpy as np
import matplotlib.pyplot as plt
plt.rcParams["font.sans-serif"] = ["SimHei"]
data_2017 = np.array([21, 35, 22, 19, 3])
data_2018 = np.array([13, 32, 27, 27, 1])
x = np.arange(5)
y = np.array([51, 73, 99, 132, 45])
labels = np.array(['一线城市', '二线城市', '三线城市', '四线及以外', '其他国家及地区'])
# 平均增长倍数
average = 75
bar_width = 0.5

# 添加无指向型注释文本
def autolabel(ax, rects):
    """ 在每个矩形条的上方附加一个文本标签, 以显示其高度"""
    for rect in rects:
        height = rect.get_height()     #  获取每个矩形条的高度
        ax.text(rect.get_x()  + bar_width/2, height + 3, s='{}'.format(height), ha='center', va='bottom')
        
# 第1个子图
ax_one = plt.subplot2grid((3,2), (0,0), rowspan=2, colspan=2)
bar_rects = ax_one.bar(x, y, tick_label=labels, color='#20B2AA', width=bar_width)
ax_one.set_title('抖音2018vs2017人群增长倍数')
ax_one.set_ylabel('增长倍数')
autolabel(ax_one, bar_rects)
ax_one.set_ylim(0, y.max() + 20)
ax_one.axhline(y=75, linestyle='--', linewidth=1, color='gray')

# 第2个子图
ax_two = plt.subplot2grid((3,2), (2,0))
ax_two.pie(data_2017, radius=1.5, labels=labels, autopct='%3.1f %%', 
           colors=['#2F4F4F', '#FF0000', '#A9A9A9', '#FFD700', '#B0C4DE'])
ax_two.set_title('2017年抖音用户地区分布的比例')

# 第3个子图
ax_thr = plt.subplot2grid((3,2), (2,1))
ax_thr.pie(data_2018, radius=1.5, labels=labels, autopct='%3.1f %%', 
           colors=['#2F4F4F', '#FF0000', '#A9A9A9', '#FFD700', '#B0C4DE' ])
ax_thr.set_title('2018年抖音用户地区分布的比例')

# 调整子图之间的距离
plt.tight_layout()
plt.show()

实例4:某地区全年气温和水量的关系

本实例要求根据下表的数据,将月份列的数据作为x轴的刻度标签,将平均气温、降水量、蒸发量三列的数据作为y轴的数据,在同一绘图区域中分别绘制反映平均气温、降水量、蒸发量关系的图表

import numpy as np
import matplotlib.pyplot as plt
plt.rcParams["font.sans-serif"] = ["SimHei"]
plt.rcParams["axes.unicode_minus"] = False
month_x = np.arange(1, 13, 1)
# 平均气温
data_tem = np.array([2.0, 2.2, 3.3, 4.5, 6.3, 10.2, 
                     20.3, 33.4, 23.0, 16.5, 12.0, 6.2])
# 降水量
data_precipitation = np.array([2.6, 5.9, 9.0, 26.4, 28.7, 70.7,  
                               175.6, 182.2, 48.7, 18.8, 6.0, 2.3])
# 蒸发量
data_evaporation = np.array([2.0, 4.9, 7.0, 23.2, 25.6, 76.7, 
                             135.6, 162.2, 32.6, 20.0, 6.4, 3.3])
fig, ax = plt.subplots()
bar_ev = ax.bar(month_x, data_evaporation, color='orange', tick_label=['1月', '2月', '3月', '4月', '5月', '6月',
                                                                       '7月', '8月', '9月', '10月', '11月', '12月'])
bar_pre = ax.bar(month_x, data_precipitation, bottom=data_evaporation, color='green')
ax.set_ylabel('水量 (ml)')
ax.set_title('平均气温与降水量、蒸发量的关系')
ax_right = ax.twinx()
line = ax_right.plot(month_x, data_tem, 'o-m')
ax_right.set_ylabel('气温($^\circ$C)')
# 添加图例
plt.legend([bar_ev, bar_pre, line[0]], ['蒸发量', '降水量', '平均气温'],
           shadow=True, fancybox=True)
plt.show()

实例5:2018上半年某品牌汽车销售情况

本实例要求根据下表的数据,分别使用3个子图进行展示:在0行第0列的区域中,绘制反映2018上半年汽车销售额的柱形图;在1行第0列和第1行第1列的区域中,绘制反映2018上半年各分公司汽车销量的折线图和堆积面积图

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.gridspec as gridspec
plt.rcParams["font.sans-serif"] = ["SimHei"]
x_month = np.array(['1月', '2月', '3月', '4月', '5月', '6月'])
y_sales = np.array([2150, 1050, 1560, 1480, 1530, 1490])
x_citys = np.array(['北京', '上海', '广州', '深圳', '浙江', '山东'])
y_sale_count = np.array([83775, 62860, 59176, 64205, 48671, 39968])
# 创建画布和布局
fig = plt.figure(constrained_layout=True)
gs = fig.add_gridspec(2, 2)
ax_one = fig.add_subplot(gs[0, :])
ax_two = fig.add_subplot(gs[1, 0])
ax_thr = fig.add_subplot(gs[1, 1])
# 第1个子图
ax_one.bar(x_month, y_sales, width=0.5, color='#3299CC')
ax_one.set_title('2018年上半年某品牌汽车的销售额')
ax_one.set_ylabel('销售额(亿元)')
# 第2个子图
ax_two.plot(x_citys, y_sale_count, 'm--o', ms=8)
ax_two.set_title('分公司某品牌汽车的销量')
ax_two.set_ylabel('销量(辆)')
# 第3个子图
ax_thr.stackplot(x_citys, y_sale_count, color='#9999FF')
ax_thr.set_title('分公司某品牌汽车的销量')
ax_thr.set_ylabel('销量(辆)')
plt.show()

 第六章坐标轴的定制

实例1:深圳市24小时的平均风速

本实例要求根据下表的数据,将时间列的数据作为x轴的刻度标签,将风速列的数据作为y轴的数据,使用plot()方法绘制反映深圳市24小时平均风速的折线图

import matplotlib.pyplot as plt
import matplotlib.dates as mdates
import numpy as np
import matplotlib.cbook as cbook

# 加载goog.npz数据
with cbook.get_sample_data('goog.npz') as datafile:
    data = np.load(datafile)
    price_data = data['price_data']

# 提取日期和调整后的收盘价
date = price_data['date']
adj_close = price_data['adj_close']

# 日期和收盘价
print(date)
print(adj_close)

fig, axs = plt.subplots(3, 1, figsize=(10, 8))

# AutoDateFormatter
axs[0].plot(date, adj_close)
axs[0].set_title('AutoDateFormatter')
axs[0].set_ylabel('Price [$]')
axs[0].grid(True) 
axs[0].xaxis.set_major_formatter(mdates.AutoDateFormatter(mdates.AutoDateLocator()))

# ConciseDateFormatter
axs[1].plot(date, adj_close)
axs[1].set_title('ConciseFormatter')
axs[1].set_ylabel('Price [$]')
locator = mdates.AutoDateLocator()
axs[1].xaxis.set_major_locator(locator)
axs[1].grid(True) 
axs[1].xaxis.set_major_formatter(mdates.ConciseDateFormatter(locator))

# Manual DateFormatter
axs[2].plot(date, adj_close)
axs[2].set_title('Manual DateFormatter')
axs[2].set_ylabel('Price [$]')
axs[2].set_xlabel('Date')
axs[2].xaxis.set_major_locator(mdates.YearLocator())
axs[2].xaxis.set_minor_locator(mdates.MonthLocator())
axs[2].grid(True) 
axs[2].xaxis.set_major_formatter(mdates.DateFormatter('%Y-%b'))

# 格式化X轴标签,使它们更清晰
fig.autofmt_xdate()

plt.tight_layout()
plt.show()

 

 实例2:深圳市24小时的平均风速

本实例要求隐藏折线图的右轴脊和上轴脊

import numpy as np
from datetime import datetime
import matplotlib.pyplot as plt
from matplotlib.dates import DateFormatter, HourLocator
plt.rcParams["font.sans-serif"] = ["SimHei"]
plt.rcParams["axes.unicode_minus"] = False
dates = ['201910240','2019102402','2019102404','2019102406',
         '2019102408','2019102410','2019102412', '2019102414',
         '2019102416','2019102418','2019102420','2019102422','201910250']
x_date = [datetime.strptime(d, '%Y%m%d%H') for d in dates]
y_data = np.array([7, 9, 11, 14, 8, 15, 22, 11, 10, 11, 11, 13, 8])
fig = plt.figure()
ax = fig.add_axes((0.0, 0.0, 1.0, 1.0))
ax.plot(x_date, y_data, '->', ms=8, mfc='#FF9900')
ax.set_title('深圳市24小时的平均风速')
ax.set_xlabel('时间')
ax.set_ylabel('平均风速(km/h)')
date_fmt = DateFormatter('%H:%M')
ax.xaxis.set_major_formatter(date_fmt)
ax.xaxis.set_major_locator(HourLocator(interval=2))
ax.tick_params(direction='in', length=6, width=2, labelsize=12)
ax.xaxis.set_tick_params(labelrotation=45)
# 隐藏上轴脊和右轴脊
ax.spines['top'].set_color('none')
ax.spines['right'].set_color('none')
plt.show()

 

 实例3:正弦与余弦曲线

本实例要求先生成100个位于-2 * np.pi2 * np.pi之间的等差数列,求等差数列中各个数值的正弦值和余弦值,根据这些正弦值和余弦值绘制曲线

import numpy as np
import matplotlib.pyplot as plt
plt.rcParams["font.sans-serif"] = ["SimHei"]
plt.rcParams["axes.unicode_minus"] = False
x_data = np.linspace(-2 * np.pi, 2 * np.pi, 100)
y_one = np.sin(x_data)
y_two = np.cos(x_data)
fig = plt.figure()
ax = fig.add_axes((0.2, 0.2, 0.7, 0.7)) 
ax.plot(x_data, y_one, label='正弦曲线')
ax.plot(x_data, y_two, label='余弦曲线')
ax.legend()
ax.set_xlim(-2 * np.pi, 2 * np.pi)
ax.set_xticks([-2 * np.pi, -3 * np.pi / 2, -1 * np.pi, -1 * np.pi / 2, 
               0, np.pi / 2, np.pi, 3 * np.pi / 2, 2 * np.pi])
ax.set_xticklabels([r'$-2\pi$', r'$-3\pi/2$', r'$-\pi$', r'$-\pi/2$', r'$0$',  
                    r'$\pi/2$', r'$\pi$', r'$3\pi/2$', r'$2\pi$'])
ax.set_yticks([-1.0, -0.5, 0.0, 0.5, 1.0])
ax.set_yticklabels([-1.0, -0.5, 0.0, 0.5, 1.0])
# 隐藏右轴脊和上轴脊
ax.spines['right'].set_color('none')
ax.spines['top'].set_color('none')
# 移动左轴脊和下轴脊的位置
ax.spines['left'].set_position(('data', 0))
ax.spines['bottom'].set_position(('data', 0))
plt.show()

第七章绘制3D图表和统计地图

 实例1:三维空间的星星

本实例要求根据一组测试数据,绘制包含若干个五角星的3D散点图,并将位于指定值范围的五角星设置成指定的颜色:若10<z<20,设置五角星的颜色为#C71585 ;若z>=20,设置五角星的颜色为#008B8B;其他情况设置五角星的颜色为黄色 。

import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
plt.rcParams["font.sans-serif"] = ["SimHei"]
plt.rcParams["axes.unicode_minus"] = False
# 生成测试数据
x = np.random.randint(0, 40, 30)
y = np.random.randint(0, 40, 30)
z = np.random.randint(0, 40, 30)
# 创建三维坐标系的绘图区域 , 并在该区域中绘制 3D 散点图
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
for xx, yy, zz in zip(x, y, z):
    color = 'y'
    if 10 < zz < 20:
        color = '#C71585'
    elif zz >= 20:
        color = '#008B8B'
        ax.scatter(xx, yy, zz, c=color, marker='*', s=160, 
                   linewidth=1, edgecolor='black')
ax.set_xlabel('x 轴 ')
ax.set_ylabel('y 轴 ')
ax.set_zlabel('z 轴 ')
ax.set_title('3D 散点图 ', fontproperties='simhei', fontsize=14)
plt.tight_layout()
plt.show()

 

实例2:三维空间闪烁的星星

本实例要求7.2.3小节绘制的3D散点图添加动画,实现五角星红色白色的闪烁效果

%matplotlib notebook
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
from matplotlib.animation import FuncAnimation

plt.rcParams["font.sans-serif"] = ["SimHei"]
plt.rcParams["axes.unicode_minus"] = False

# 生成测试数据
xx = np.array([13, 5, 25, 13, 9, 19, 3, 39, 13, 27])
yy = np.array([4, 38, 16, 26, 7, 19, 28, 10, 17, 18])
zz = np.array([7, 19, 6, 12, 25, 19, 23, 25, 10, 15])

fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')

# 绘制初始的 3D 散点图
star = ax.scatter(xx, yy, zz, c='#C71585', marker='*', s=160,
                  linewidth=1, edgecolor='black')

# 每帧动画调用的函数
def animate(i):
    if i % 2:
        color = '#C71585'
    else:
        color = 'white'
    next_star = ax.scatter(xx, yy, zz, c=color, marker='*', s=160, 
                           linewidth=1, edgecolor='black')
    return next_star

def init():
    return star

ani = FuncAnimation(fig=fig, func=animate, frames=np.arange(0, 20), init_func=init, 
                    interval=1000, blit=False)

ax.set_xlabel('x 轴 ')
ax.set_ylabel('y 轴 ')
ax.set_zlabel('z 轴 ')
ax.set_title('3D 散点图 ', fontproperties='simhei', fontsize=14)

plt.tight_layout()
plt.show()

 

实例3:美国部分城镇人口分布

本实例要求根据下表的数据(存储于2014_us_cities.csv文件中),获取500条数据,将获取latlon两列的地理坐标转换到地图投影中,将pop列的数据绘制气泡并显示到地图上

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from mpl_toolkits.basemap import Basemap
plt.rcParams["font.sans-serif"] = ["SimHei"]
plt.rcParams["axes.unicode_minus"] = False
# 创建 Basemap 对象
map = Basemap(projection='stere', lat_0=90, lon_0=-105, llcrnrlat=23.41, 
              urcrnrlat=45.44, llcrnrlon=-118.67, urcrnrlon=-64.52, 
              rsphere=6371200., resolution='l', area_thresh=10000)
map.drawmapboundary()#绘制地图投影周围边界
map.drawstates()# 绘制州界
map.drawcoastlines()#绘制海岸线
map.drawcountries()#绘制国家边界
# 绘制纬线
parallels = np.arange(0., 90, 10.) 
map.drawparallels(parallels, labels=[1, 0, 0, 0], fontsize=10)
# 绘制经线
meridians = np.arange(-110., -60., 10.)
map.drawmeridians(meridians, labels=[0, 0, 0, 1], fontsize=10) 
posi = pd.read_csv("2014_us_cities.csv") 
# 从 3228 组城市数据中选择 500 组数据
lat = np.array(posi["lat"][0:500])# 获取纬度值
lon = np.array(posi["lon"][0:500])# 获取经度值
pop = np.array(posi["pop"][0:500], dtype=float)# 获取人口数
# 气泡图的气泡大小
size = (pop / np.max(pop)) * 1000 
x, y = map(lon, lat)
map.scatter(x, y, s=size)
plt.title('2014 年美国部分城镇的人口分布情况 ')
plt.show()

 

实例4:绘制3D柱形图

数据:

xedges = np.array([10,20,30,40,50,60,70])

yedges = np.array([10,20,30,40,50,60,70])

hist =np.array( [[0.0964,0.1024,0.1043,0.1057,0.1072,0.1100],

[0.1027,0.1039,0.1057,0.1069,0.1078,0.1109],

[0.1046,0.1059,0.1061,0.1079,0.1085,0.1114],

[0.1068,0.1079,0.1084,0.1091,0.1096,0.1127],

[0.1091,0.1089,0.1107,0.1112,0.1118,0.1131],

[0.1102,0.1113,0.1121,0.1129,0.1133,0.1157]])

使用以上数据绘制3D柱形图:

from mpl_toolkits.mplot3d import Axes3D
import matplotlib.pyplot as plt
import numpy as np
#设置x轴取值
xedges = np.array([10,20,30,40,50,60,70])
#设置y轴取值
yedges = np.array([10,20,30,40,50,60,70])
#设置X,Y对应点的值。即原始数据。
hist =np.array( [[0.0964,0.1024,0.1043,0.1057,0.1072,0.1100],
                 [0.1027,0.1039,0.1057,0.1069,0.1078,0.1109],
                 [0.1046,0.1059,0.1061,0.1079, 0.1085,0.1114],
                 [0.1068,0.1079,0.1084,0.1091, 0.1096, 0.1127],
                 [0.1091,0.1089,0.1107,0.1112,0.1118,0.1131],
                 [0.1102,0.1113,0.1121,0.1129,0.1133,0.1157]])
#生成图表对象。
fig = plt.figure(figsize=(8,8))
#生成子图对象,类型为3d
ax1 = fig.add_subplot(111,projection='3d')
#设置作图点的坐标
xpos, ypos = np.meshgrid(xedges[ :- 1]-2.5 , yedges[ :- 1]-2.5 )
print(xpos,ypos)
xpos = xpos.flatten('F')
print('xpos', xpos)
ypos = ypos.flatten('F')
zpos = np.zeros_like(xpos)
print('zpos', zpos)
#设置柱形图大小
dx =5 * np.ones_like(zpos)
#print(dx)
dy = dx.copy()
dz = hist.flatten()
# print(dz)
#设置坐标轴标签
ax1.set_xlabel('R')
ax1.set_ylabel('K')
ax1.set_zlabel('Recall')
ax1.bar3d(xpos, ypos, zpos, dx, dy, dz, color='b', zsort='average')
plt.show()

 

第八章使用matplotlib绘制高级图表

实例一 绘制等高线图

#1.绘制等高线图
import numpy as np
import matplotlib.pyplot as plt
# 计算高度
def calcu_elevation(x1, y1):
    h = (1-x1/2 + x1**5 + y1**3) * np.exp(-x1**2 - y1**2)
    return h
n = 256
x = np.linspace(-2, 2, n)
y = np.linspace(-2, 2, n)
# 利用meshgrid() 函数生成网格数据
x_grid, y_grid = np.meshgrid(x, y)
fig = plt.figure()
ax = fig.add_subplot(111)
# 绘制等高线
con = ax.contour(x_grid, y_grid, calcu_elevation(x_grid, y_grid), 8, colors='black')
# 填充等高线的颜色
ax.contourf(x_grid, y_grid, calcu_elevation(x_grid, y_grid), 8, alpha=0.75, cmap=plt.cm.copper)
# 为等高线添加文字标签
ax.clabel(con, inline=True, fmt='%1.1f', fontsize=10)
ax.set_xticks([])
ax.set_yticks([])
plt.show()

实例二 绘制矢量场流线图

#2.绘制矢量场流线图
import numpy as np
import matplotlib.pyplot as plt
y, x = np.mgrid[0:5:50j, 0:5:50j]
u = x
v = y
fig = plt.figure()
ax = fig.add_subplot(111)
# 绘制矢量场流线图
ax.streamplot(x, y, u, v)
plt.show()

实例三 绘制棉棒图

下面根据表格中的数据,将轿车品牌列的数据作为x轴的标签,将燃料消耗量列的数据作为y轴的数据,使用stem()绘制不同品牌轿车燃料消耗量的棉棒图

#3.绘制棉棒图
import numpy as np
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = 'SimHei'
plt.rcParams['axes.unicode_minus'] = False
x = np.arange(1, 16)
y = np.array([5.9, 6.2, 6.7, 7.0, 7.0, 7.1, 7.2, 7.4,
              7.5, 7.6, 7.7, 7.7, 7.7, 7.8, 7.9])
labels = np.array([' 宝骏310', ' 宝马i3', ' 致享', ' 焕驰', ' 力帆530',
                   '派力奥', ' 悦翔V3', ' 乐风RV', ' 奥迪A1', ' 威驰FS',
                   '夏利N7', ' 启辰R30', ' 和悦A13RS', ' 致炫', ' 赛欧'])
fig = plt.figure(figsize=(10, 6), dpi= 80)
ax = fig.add_subplot(111)
# 绘制棉棒图
markerline, stemlines, baseline = ax.stem(x, y, linefmt='--',markerfmt='o', 
                                          label='TestStem', use_line_collection=True)
# 设置棉棒图线段的属性
plt.setp(stemlines, lw=1)
ax.set_title(' 不同品牌轿车的燃料消耗量', fontdict={'size':18})
ax.set_ylabel(' 燃料消耗量(L/km)')
ax.set_xticks(x)
ax.set_xticklabels(labels, rotation=60)
ax.set_ylim([0, 10])
for temp_x, temp_y in zip(x, y):
    ax.text(temp_x, temp_y+0.5, s='{}'.format(temp_y), ha= 'center',
            va='bottom', fontsize=14)
plt.show()

实例四 绘制哑铃图

下面根据health.xlsx文件的数据,将city列的数据作为y轴的刻度标签,将pct_2014pct_2013两列的数据作为数据点再在两个数据点之间添加线条,绘制由数据点和线条组成的哑铃图

#4.绘制哑铃图
import pandas as pd
import matplotlib.pyplot as plt
import matplotlib.lines as mlines
plt.rcParams['font.sans-serif'] = 'SimHei'
plt.rcParams['axes.unicode_minus'] = False
df = pd.read_excel(r"C:\Users\Administrator\Desktop\实验8\health.xlsx")
df.sort_values('pct_2014', inplace=True)
df.reset_index(inplace=True)
df = df.sort_values(by="index")
def newline(p1, p2, color='black'):
    ax = plt.gca()
    l = mlines.Line2D([p1[0], p2[0]], [p1[1],p2[1]], color='skyblue')
    ax.add_line(l)
    return l
fig, ax = plt.subplots(1, 1, figsize=(8, 6))
# 绘制散点
ax.scatter(y=df['index'], x=df['pct_2013'], s=50,
           color='#0e668b', alpha=0.7)
ax.scatter(y=df['index'], x=df['pct_2014'], s=50,
           color='#a3c4dc', alpha=0.7)
# 绘制线条
for i, p1, p2 in zip(df['index'], df['pct_2013'], df['pct_2014']):
    newline([p1, i], [p2, i])
ax.set_title("2013年与2014年美国部分城市人口PCT指标的变化率", fontdict={'size':12})
ax.set_xlim(0, .25)
ax.set_xticks([.05, .1, .15, .20])
ax.set_xticklabels(['5%', '10%', '15%', '20%'])
ax.set_xlabel(' 变化率')
ax.set_yticks(df['index'])
ax.set_yticklabels(df['city'])
ax.grid(alpha=0.5, axis='x')
plt.show()

实例五 绘制甘特图

已知每个子任务的开发周期依次为:0.5, 1.5, 1, 3, 0.5, 1, 1,2,下面根据这些数据,使用barh()函数绘制一个甘特图,通过该图表展示整个项目的开发周期

#5.绘制甘特图
import numpy as np
import matplotlib.pyplot as plt
ticks = np.array([' 报告提交', ' 数据分析', ' 数据录入', ' 实地执行',
                  ' 问卷确定', ' 试访', ' 问卷设计', ' 项目确定'])
y_data = np.arange(1, 9)
x_data = np.array([0.5, 1.5, 1, 3, 0.5, 1, 1,2])
fig,ax = plt.subplots(1, 1)
ax.barh(y_data, x_data, tick_label=ticks,
        left=[7.5, 6, 5.5, 3, 3, 2, 1.5, 0], color='#CD5C5C')
[ax.spines[i].set_visible(False) for i in ['top', 'right']]
ax.set_title(" 任务甘特图")
ax.set_xlabel(" 日期")
ax.grid(alpha=0.5, axis='x')
plt.show()

实例六 绘制人口金字塔

下面使用pandas读取population.xlsx文件的数据,并根据读取的数据绘制一个下图所示的人口金字塔图

#6.绘制人口金字塔图
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = 'SimHei'
plt.rcParams['axes.unicode_minus'] = False
df = pd.read_excel(r'C:\Users\Administrator\Desktop\实验8\population.xlsx')
df_male = df.groupby(by='Gender').get_group('Male')
list_male = df_male['Number'].values.tolist()      # 将ndarray 转换为list
df_female = df.groupby(by='Gender').get_group('Female')
list_female = df_female['Number'].values.tolist()  # 将ndarray 转换为list
df_age = df.groupby('AgeGroup').sum()
count = df_age.shape[0]
y = np.arange(1, 11)
labels = []
for i in range(count):
    age = df_age.index[i]
    labels.append(age)
fig = plt.figure()
ax = fig.add_subplot(111)
# 绘制人口金字塔图
ax.barh(y, list_male, tick_label=labels, label=' 男', color='#6699FF')
ax.barh(y, list_female, tick_label=labels, label=' 女', color='#CC6699')
ax.set_ylabel(" 年龄段(岁)")
ax.set_xticks([-100000, -75000, -50000, -25000, 0, 25000, 50000, 75000, 100000])
ax.set_xticklabels(['100000', '75000', '50000', '25000', '0', '25000', '50000', '75000', '100000'])
ax.set_xlabel(" 人数")
ax.set_title(' 某城市人口金字塔')
ax.legend()
plt.show()

实例七 绘制漏斗图

 下面根据的表格中的数据,绘制一个由矩形条和线段组成的简易版的漏斗图

#7.绘制漏斗图
import numpy as np
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = 'SimHei'
plt.rcParams['axes.unicode_minus'] = False
num = 5
height = 0.5
x1 = np.array([1000, 500, 300, 200, 150])   # 各环节的客户数量
x2 = np.array((x1.max() - x1) / 2)
x3 = [i+j for i, j in zip(x1, x2)]
x3 = np.array(x3)
y = -np.sort(-np.arange(num))    # 倒转y 轴
labels=[' 访问商品', ' 加购物车', ' 生成订单', ' 支付订单', ' 完成交易']
fig = plt.figure(figsize=(10, 8))
ax = fig.add_subplot(111)
# 绘制条形图
rects1 = ax.barh(y, x3, height, tick_label=labels, color='g', alpha=0.5)
# 绘制辅助条形图
rects2 = ax.barh(y, x2, height, color='w', alpha=1)
ax.plot(x3, y, 'black', alpha=0.7)
ax.plot(x2, y, 'black', alpha=0.7)
# 添加无指向型注释文本
notes = []
for i in range(0, len(x1)):
    notes.append('%.2f%%'%((x1[i] / x1[0]) * 100))
for rect_one, rect_two, note in zip(rects1, rects2, notes):
    text_x = rect_two.get_width() + (rect_one.get_width()
                                     - rect_two.get_width()) / 2 - 30
    text_y = rect_one.get_y() + height / 2
    ax.text(text_x, text_y, note, fontsize=12)
# 隐藏轴脊和刻度
ax.set_xticks([])
for direction in ['top', 'left', 'bottom', 'right']:
    ax.spines[direction].set_color('none')
ax.yaxis.set_ticks_position('none')
plt.show()

实例八 绘制桑基图 

假设现在小明家日常生活的开支主要分为旅行、聚餐、生活、购物、深造、运动、买书和其它几类,且其中每项投入或产出值分别为0.20.10.40.3-0.6-0.05-0.15-0.2。下面结合这些日常生活开支的数据绘制一个桑基图。

#8.绘制桑基图
import matplotlib.pyplot as plt
from matplotlib.sankey import Sankey
plt.rcParams["font.sans-serif"] = ["SimHei"]
plt.rcParams["axes.unicode_minus"] = False
# 消费收入与支出数据
flows = [0.7, 0.3, -0.3, -0.1, -0.3, -0.1, -0.1, -0.1]
# 流的标签列表
labels = [" 工资", " 副业", " 生活", " 购物", " 深造", " 运动", " 其他", " 买书"]
# 流的方向
orientations = [1, 1, 0, -1, 1, -1, 1, 0]
# 创建Sankey 类对象
sankey = Sankey()
# 为桑基图添加数据
sankey.add(flows=flows,                 # 收入与支出数据
           labels=labels,               # 数据标签
           orientations=orientations,   # 标签显示的方向
           color="black",               # 边缘线条颜色
           fc="lightgreen",             # 填充颜色
           patchlabel=" 生活消费",      # 图表中心的标签
           alpha=0.7)                   # 透明度
# 桑基图绘制完成的对象
diagrams = sankey.finish()
diagrams[0].texts[4].set_color("r")
diagrams[0].texts[4].set_weight("bold")
diagrams[0].text.set_fontsize(20)
diagrams[0].text.set_fontweight("bold")
plt.title(" 日常生活开支的桑基图")
plt.show()

实例九 绘制树状图

美国对各个州的谋杀、暴力、爆炸犯罪案件的数量进行了统计,并将统计后的结果整理到USArrests.xlsx文件中。下面使用pandas读取USArrests.xlsx文件的数据,并将犯罪案例数量相似度高的州进行聚类后绘制一个树状图

#9.绘制树状图  
import pandas as pd
import matplotlib.pyplot as plt
import scipy.cluster.hierarchy as shc
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
df = pd.read_excel(r'USArrests.xlsx')
plt.figure(figsize=(10, 6), dpi= 80)
plt.title(" 美国各州犯罪案件的树状图", fontsize=12)
# 绘制树状图
dend = shc.dendrogram(shc.linkage(df[['Murder','Assault','UrbanPop']],
                                  method='ward'),labels=df.State.values,color_threshold=100)
plt.xticks(fontsize=10.5)
plt.ylabel(' 案例数量')
plt.show()

实例十 绘制华夫饼图

假设某影院于周六上映了电影少年的你,并统计了1号观影厅的上座率为95%。下面结合matplotlibpywaffle绘制一个说明1号厅上座率的华夫饼图。

#10.绘制华夫饼图
import matplotlib.pyplot as plt
from pywaffle import Waffle
plt.rcParams['font.sans-serif'] = 'SimHei'
plt.rcParams['axes.unicode_minus'] = False
# 绘制华夫饼图
plt.figure(FigureClass=Waffle, rows=10, columns=10,
           values=[95, 5],vertical=True, colors=['#20B2AA', '#D3D3D3'],
           title={'label': ' 电影《少年的你》上座率'},
           legend={'loc': 'upper right', 'labels': [' 占座', ' 空座']})
plt.show()

第九章 Pyecharts

##在使用以下代码时,如果运行完后图不出来,把代码的最后一句单独几次

1 绘制折线图

from pyecharts.globals import CurrentConfig, NotebookType
CurrentConfig.NOTEBOOK_TYPE = NotebookType.JUPYTER_LAB
import pyecharts.options as opts
from pyecharts.charts import Line
line_demo = (
    Line()# 添加 x 轴、 y 轴的数据、 系列名称
    .add_xaxis([' 可乐 ', ' 雪碧 ', ' 啤酒 ', ' 橙汁 ', ' 奶茶 '])
    .add_yaxis(' 商家 A', [102, 132, 105, 52, 90],symbol='diamond', symbol_size=15)
    .add_yaxis(' 商家 B', [86, 108, 128, 66, 136],symbol='triangle', symbol_size=15)
    # 设置标题、 y 轴标签
    .set_global_opts(title_opts=opts.TitleOpts(title=" 折线图示例 "), 
                     yaxis_opts=opts.AxisOpts(name=" 销售额 ( 万元 )",
                                              name_location="center", name_gap=30))
)
line_demo.load_javascript()

line_demo.render_notebook()

2 绘制饼图或圆环图

from pyecharts.globals import CurrentConfig, NotebookType
CurrentConfig.NOTEBOOK_TYPE = NotebookType.JUPYTER_LAB
import pyecharts.options as opts
from pyecharts.charts import Pie
pie_demo = (
    Pie()
    .add("", [(' 小米 ', 150), (' 三星 ', 20), (' 华为 ', 120), (' 苹果 ', 120), 
              (' 魅族 ', 117), ('vivo', 145), ('OPPO', 128)])
    .set_global_opts(title_opts=opts.TitleOpts(title=" 饼图示例 "))
)
pie_demo.load_javascript()

pie_demo.render_notebook()

3 绘制散点图

from pyecharts.globals import CurrentConfig, NotebookType
CurrentConfig.NOTEBOOK_TYPE = NotebookType.JUPYTER_LAB
import pyecharts.options as opts
from pyecharts.charts import Scatter
scatter_demo = (
    Scatter()
    .add_xaxis([' 周一 ', ' 周二 ', ' 周三 ', ' 周四 ', ' 周五 ', ' 周六 ', ' 周日 '])
    .add_yaxis("", [30, 108, 73, 116, 73, 143, 106])
    # 设置标题、 x 轴网格、 y 轴网格和标签
    .set_global_opts(title_opts=opts.TitleOpts(title=" 散点图示例 "), 
                     xaxis_opts=opts.AxisOpts(splitline_opts=
                                              opts.SplitLineOpts(is_show=True)),
                     yaxis_opts=opts.AxisOpts(splitline_opts=
                                              opts.SplitLineOpts(is_show=True), name=" 用户活跃量 ( 人 )",
                                              name_location="center", name_gap=30)
                    )
)
scatter_demo.load_javascript()

scatter_demo.render_notebook()

4 绘制3D柱形图

from pyecharts.globals import CurrentConfig, NotebookType
CurrentConfig.NOTEBOOK_TYPE = NotebookType.JUPYTER_LAB
import random
from pyecharts import options as opts
from pyecharts.charts import Bar3D
data = [(i, j, random.randint(0, 20)) for i in range(7) for j in range(5)]
bar_3d = (
    Bar3D()
    .add("", [[d[1], d[0], d[2]] for d in data], 
         xaxis3d_opts=opts.Axis3DOpts(['A 组 ', 'B 组 ', 'C 组 ','D 组 ', 'E 组 '],
                                      type_="category", name=""),
         yaxis3d_opts=opts.Axis3DOpts([' 周一 ', ' 周二 ', ' 周三 ',' 周四 ', 
                                       ' 周五 ', ' 周六 ', ' 周日 '], type_="category", name=""),
         zaxis3d_opts=opts.Axis3DOpts(type_="value", name=" 销售额 ( 万元 )")
        )
    .set_global_opts(
        visualmap_opts=opts.VisualMapOpts(max_=30),
        title_opts=opts.TitleOpts(title="3D 柱形图示例 ")
    )
)
bar_3d.load_javascript()

bar_3d.render_notebook()

5 绘制统计地图

from pyecharts.globals import CurrentConfig, NotebookType
CurrentConfig.NOTEBOOK_TYPE = NotebookType.JUPYTER_LAB
from pyecharts import options as opts
from pyecharts.charts import Map
data_map = [['朔城区', 100], ['平鲁区', 88], ['山阴县', 99], ['应县', 68],['右玉县', 35], ['怀仁县', 28]]
# 创建 Map 对象
map_demo = (
    Map()
    .add(" 商家 A", data_map, "朔州")
    .set_global_opts(title_opts=opts.TitleOpts(title=" 朔州地图示例 "), visualmap_opts=opts.VisualMapOpts())
)
map_demo.load_javascript()

map_demo.render_notebook()

6 绘制漏斗图

from pyecharts.globals import CurrentConfig, NotebookType
CurrentConfig.NOTEBOOK_TYPE = NotebookType.JUPYTER_LAB
from pyecharts import options as opts
from pyecharts.charts import Funnel
data_fun = [[' 访问商品 ', 100], [' 加购物车 ', 50], [' 生成订单 ', 30], 
            [' 支付订单 ', 20], [' 完成交易 ', 15]]
# 创建 Funnel 对象
funnel_demo = (
    Funnel()
    .add("", data_fun, sort_='descending', 
         tooltip_opts=opts.TooltipOpts(trigger="item",
                                       formatter="{a} <br/>{b} : {c}%"))
    .set_global_opts(title_opts=opts.TitleOpts(title=" 漏斗图示例 "))
)
funnel_demo.load_javascript()

funnel_demo.render_notebook()

7 绘制桑基图

from pyecharts.globals import CurrentConfig, NotebookType
CurrentConfig.NOTEBOOK_TYPE = NotebookType.JUPYTER_LAB
from pyecharts import options as opts
from pyecharts.charts import Sankey
nodes = [
    {"name": " 消费者 "},
    {"name": " 老客户 "},
    {"name": " 新客户 "},
    {"name": " 运动鞋 "},
    {"name": " 衬衫 "},
    {"name": " 连衣裙 "},
    {"name": " 高跟鞋 "}
]
links = [
    {"source": " 消费者 ", "target": " 老客户 ", "value": 30},
    {"source": " 消费者 ", "target": " 新客户 ", "value": 20},
    {"source": " 老客户 ", "target": " 运动鞋 ", "value": 10},
    {"source": " 老客户 ", "target": " 衬衫 ", "value": 20},
    {"source": " 新客户 ", "target": " 连衣裙 ", "value": 10},
    {"source": " 新客户 ", "target": " 高跟鞋 ", "value": 10}
]
sankey_demo = (
    Sankey()
    .add(
        "", nodes=nodes, links=links,
        linestyle_opt=opts.LineStyleOpts(opacity=0.2, curve=0.5, 
                                         color="source"),
        label_opts=opts.LabelOpts(position="right")
    )
    .set_global_opts(title_opts=opts.TitleOpts(title=" 桑基图示例 "))
)
sankey_demo.load_javascript()

sankey_demo.render_notebook()

8 并行多图

from pyecharts.globals import CurrentConfig, NotebookType
CurrentConfig.NOTEBOOK_TYPE = NotebookType.JUPYTER_LAB
from pyecharts import options as opts
from pyecharts.charts import Bar, Line, Grid
x_data = [' 小米 ', ' 三星 ', ' 华为 ', ' 苹果 ', ' 魅族 ', 'vivo', 'OPPO']
y_a = [107, 36, 102, 91, 51, 113, 45]
y_b = [104, 60, 33, 138, 105, 111, 91]
bar = (
    Bar()
    .add_xaxis(x_data)
    .add_yaxis(" 商家 A", y_a)
    .add_yaxis(" 商家 B", y_b)
    .set_global_opts(title_opts=opts.TitleOpts(title=" 组合图表 - 柱形图 "), 
                     yaxis_opts=opts.AxisOpts(name=" 销售额 ( 万元 )",
                                              name_location="center", name_gap=30))
)
line = (
    Line()
    .add_xaxis(x_data)
    .add_yaxis(" 商家 A", y_a)
    .add_yaxis(" 商家 B", y_b)
    .set_global_opts(
        title_opts=opts.TitleOpts(title=" 组合图表 - 折线图 ", pos_top="48%"),
        legend_opts=opts.LegendOpts(pos_top="48%"),
        yaxis_opts=opts.AxisOpts(name=" 销售额 ( 万元 )", name_location="center", 
                                 name_gap=30)
    )
)
# 创建组合图表 , 并以上下布局的方式显示柱形图和折线图
grid = (
    Grid()
    .add(bar, grid_opts=opts.GridOpts(pos_bottom="60%"))
    .add(line, grid_opts=opts.GridOpts(pos_top="60%"))
)
grid.load_javascript()

grid.render_notebook()

9 顺序多图

from pyecharts.globals import CurrentConfig, NotebookType
CurrentConfig.NOTEBOOK_TYPE = NotebookType.JUPYTER_LAB
from pyecharts import options as opts
from pyecharts.charts import Bar, Line, Page
x_data = [' 小米 ', ' 三星 ', ' 华为 ', ' 苹果 ', ' 魅族 ', 'vivo', 'OPPO']
y_a = [107, 36, 102, 91, 51, 113, 45]
y_b = [104, 60, 33, 138, 105, 111, 91]
bar = (
    Bar()
    .add_xaxis(x_data)
    .add_yaxis(" 商家 A", y_a)
    .add_yaxis(" 商家 B", y_b)
    .set_global_opts(title_opts=opts.TitleOpts(title=" 组合图表 - 柱形图 "), 
                     yaxis_opts=opts.AxisOpts(name=" 销售额 ( 万元 )",
                                              name_location="center", name_gap=30))
)
line = (
    Line()
    .add_xaxis(x_data)
    .add_yaxis(" 商家 A", y_a)
    .add_yaxis(" 商家 B", y_b)
    .set_global_opts(title_opts=opts.TitleOpts(title=" 组合图表 - 折线图 "),
                     yaxis_opts=opts.AxisOpts(name=" 销售额 ( 万元 )",
                                              name_location="center", name_gap=30))
)
# 创建组合图表 , 并在同一网页上按顺序显示柱形图和折线图
page = Page()
page.add(bar, line)
page.load_javascript()

page.render_notebook()

10 选项卡多图

from pyecharts.globals import CurrentConfig, NotebookType
CurrentConfig.NOTEBOOK_TYPE = NotebookType.JUPYTER_LAB
from pyecharts import options as opts
from pyecharts.charts import Bar, Line, Tab
x_data = [' 小米 ', ' 三星 ', ' 华为 ', ' 苹果 ', ' 魅族 ', 'vivo', 'OPPO']
y_a = [107, 36, 102, 91, 51, 113, 45]
y_b = [104, 60, 33, 138, 105, 111, 91]
bar = (
    Bar()
    .add_xaxis(x_data)
    .add_yaxis(" 商家 A", y_a)
    .add_yaxis(" 商家 B", y_b)
    .set_global_opts(yaxis_opts=opts.AxisOpts(name=" 销售额 ( 万元 )", 
                                              name_location="center", name_gap=30))
)
line = (
    Line()
    .add_xaxis(x_data)
    .add_yaxis(" 商家 A", y_a)
    .add_yaxis(" 商家 B", y_b)
    .set_global_opts(yaxis_opts=opts.AxisOpts(name=" 销售额 ( 万元 )", 
                                              name_location="center", name_gap=30))
)
# 创建组合图表 , 并以单击选项卡的方式显示柱形图或折线图
tab = Tab()
tab.add(bar, " 柱形图 ")
tab.add(line, " 折线图 ")
tab.load_javascript()

tab.render_notebook()

11 时间线轮播多图

from pyecharts.globals import CurrentConfig, NotebookType
CurrentConfig.NOTEBOOK_TYPE = NotebookType.JUPYTER_LAB
from pyecharts.faker import Faker
from pyecharts import options as opts
from pyecharts.charts import Bar, Page, Pie, Timeline
# 随机获取一组测试数据
x = Faker.choose()
tl = Timeline()
for i in range(2015, 2020):
    bar = (
        Bar()
        .add_xaxis(x)
        # Faker.values() 生成一个包含 7 个随机整数的列表
        .add_yaxis(" 商家 A", Faker.values())
        .add_yaxis(" 商家 B", Faker.values())
        .set_global_opts(title_opts=opts.TitleOpts(" 时间线轮播柱形图示例 "), 
                         yaxis_opts=opts.AxisOpts(name=" 销售额 ( 万元 )",
                                                  name_location="center", name_gap=30))
    )
    tl.add(bar, "{} 年 ".format(i))
tl.load_javascript()

tl.render_notebook()

12 虎扑社区

from pyecharts.globals import CurrentConfig, NotebookType
CurrentConfig.NOTEBOOK_TYPE = NotebookType.JUPYTER_LAB
import pyecharts.options as opts
from pyecharts.globals import ThemeType
from pyecharts.charts import Pie, Line, Map, Page
pie_hupu = (
    Pie()
    # 添加数据
    .add("", [('NBA', 232345), ('CBA', 16976), (' 国际足球 ', 44381), 
              (' 中国足球 ', 124), (' 步行街 ', 512266), (' 游戏电竞 ', 129065), 
              (' 自建板块 ', 3805), (' 运动装备 ', 35124), (' 综合体育 ', 4454), 
              (' 虎扑社团 ', 646), (' 站务管理 ', 34467)], center=["50%", "50%"],
         radius=[100, 160])
    # 设置标题和图例
    .set_global_opts(title_opts=opts.TitleOpts(title=" 虎扑社区各板块发帖数 "),
                     legend_opts=opts.LegendOpts(pos_left=10,
                                                 pos_top=80, orient='vertical'))
)

line_hupu = (
    Line(init_opts=opts.InitOpts(theme=ThemeType.ROMA))
    .add_xaxis(['{} : 00'.format(num) for num in range(24) if num%2==0])
    .add_yaxis('NBA', [259, 114, 134, 397, 840, 1577, 1413, 713, 647, 
                       448, 462, 514], symbol='diamond', symbol_size=15)
    .add_yaxis(' 虎扑 ', [1221, 370, 359, 845, 2270, 3582, 2947, 2215, 2106,
                        1843, 2045, 2178], symbol='triangle', symbol_size=15)
    .set_global_opts(title_opts=opts.TitleOpts(
        title=" 虎扑社区和 NBA 板块 24 小时发帖数 "), yaxis_opts=opts.AxisOpts(
        name=" 发帖数 ( 个 )", name_location="center", name_gap=40))
)

from pyecharts import options as opts
from pyecharts.charts import Map
data_map = [[' 朔城区 ', 100], [' 平鲁区 ', 70], [' 山阴县 ', 68], [' 应县 ', 40],[' 右玉县 ', 30], [' 怀仁县 ', 30]]
map_hupu = (
    Map()
    .add("", data_map, maptype=" 朔州 ")
    .set_global_opts(title_opts=opts.TitleOpts(
        title=" 虎扑朔州市用户地域分布 "),
                     visualmap_opts=opts.VisualMapOpts(max_=100))
)
page = Page()
page.add(pie_hupu, line_hupu, map_hupu)
page.load_javascript()

page.render_notebook()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值