在一张画布中绘制多个图表

Matplotlib模块在绘制图表时,默认先建立一张画布,然后在画布中显示绘制的图表。

如果想要在一张画布中绘制多个图表,可以使用subplot()函数将画布划分为几个区域,然后在各个区域中分别绘制不同的图表。

subplot()函数的参数为3个整型数字:

  • 第1个数字代表将整张画布划分为几行;
  • 第2个数字代表将整张画布划分为几列;
  • 第3个数字代表要在第几个区域中绘制图表,区域的编号规则是按照从左到右、从上到下的顺序,从1开始编号。

演示代码如下:

import matplotlib.pyplot as plt

# 如果值中有中文字符,则必须在绘制图表前加上这两行代码
plt.rcParams['font.sans-serif'] = ['Microsoft YaHei']
plt.rcParams['axes.unicode_minus'] = False
x = ['1月', '2月', '3月', '4月', '5月', '6月', '7月', '8月', '9月', '10月', '11月', '12月']
y = [50, 45, 65, 76, 75, 85, 55, 78, 86, 89, 94, 90]
plt.subplot(2, 2, 1)
plt.pie(y, labels = x, labeldistance = 1.1, startangle = 90, counterclock = False)
plt.subplot(2, 2, 2) # 参数width用于设置柱子的宽度,默认值为0.8。如果设置为1,则各个柱子会紧密相连;如果设置为大于1的数,则各个柱子会相互交叠
plt.bar(x, y, width = 0.5, color = 'r')
plt.subplot(2, 2, 3) # 参数color用于设置柱子的填充颜色,具体取值见后面的说明
plt.stackplot(x, y, color = 'r')
plt.subplot(2, 2, 4)
plt.plot(x, y, color = 'r', linestyle = 'solid', linewidth = 2, marker = 'o', markersize = 10)
plt.show()

输出结果:

用颜色名的英文单词或其简写定义的8种基础颜色,具体见:

加图表元素

import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['Microsoft YaHei']
plt.rcParams['axes.unicode_minus'] = False
x = ['1月', '2月', '3月', '4月', '5月', '6月', '7月', '8月', '9月', '10月', '11月', '12月']
y = [50, 45, 65, 76, 75, 85, 55, 78, 86, 89, 94, 90] # 这里加了标签
plt.bar(x, y, width=0.6, color='r', label='销售额(万元)') # 这里加了标题,loc还可以是right和left
plt.title(label='销售额对比图', fontdict={'family': 'KaiTi', 'color': 'k', 'size': 30}, loc='center') # 坐标上的标签
plt.xlabel('月份', fontdict={'family': 'SimSun', 'color': 'k', 'size': 20}, labelpad=20)
plt.ylabel('销售额', fontdict={'family': 'SimSun', 'color': 'k', 'size': 20}, labelpad=20) # legend()函数用于添加图例
plt.legend(loc='upper left', fontsize=15) # zip() 函数用于将可迭代的对象作为参数,将对象中对应的元素打包成一个个元组,然后返回由这些元组组成的列表。
for a,b in zip(x, y):
# text()函数的功能是在图表坐标系的指定位置添加文本。参数ha是horizontalalignment的简称,相对应有va
plt.text(x=a, y=b, s=b, ha='center', va='bottom', fontdict={'family': 'KaiTi', 'color': 'k', 'size': 20})
plt.show()

输出结果

气泡图

气泡图是一种展示三个变量之间关系的图表,它其实是在散点图的基础上升级改造而成的,在原有的x坐标和y坐标两个变量的基础上,引入第三个变量,并用气泡的大小表示。

pip install openpyxl

产品销售统计.xls 内容

产品名称 销售量(件) 销售额(元) 毛利率(%)
牛仔裤 125 6800 30
连衣裙 278 5600 20
运动裤 366 7800 35
短裤 452 5800 10
短裙 365 5400 50
背带裤 258 10000 22
半身裙 369 3600 15
阔腿裤 566 7800 8

代码如下:

import matplotlib.pyplot as plt
import pandas as pd
plt.rcParams['font.sans-serif'] = ['Microsoft YaHei']
plt.rcParams['axes.unicode_minus'] = False
data = pd.read_excel('产品销售统计.xls')
n = data['产品名称']
x = data['销售量(件)']
y = data['销售额(元)']
z = data['毛利率(%)']
plt.scatter(x, y, s=z * 300, color='r', marker='o')
plt.xlabel('销售量(件)', fontdict={'family': 'Microsoft YaHei', 'color': 'k', 'size': 20}, labelpad=20)
plt.ylabel('销售额(元)', fontdict={'family': 'Microsoft YaHei', 'color': 'k', 'size': 20}, labelpad=20)
plt.title('销售量、销售额与毛利率关系图', fontdict={'family': 'Microsoft YaHei', 'color': 'k', 'size': 30}, loc='center')
for a, b, c in zip(x, y, n):
plt.text(x=a, y=b, s=c, ha='center', va='center', fontsize=15, color='w')
plt.xlim(50, 600)
plt.ylim(2900, 11000)
plt.show()

输出结果:

组合图

组合图是指在一个坐标系中绘制多张图表,其实现方式也很简单,在使用Matplotlib模块中的函数绘制图表时设置多组y坐标值即可。

销售业绩表.xls

月份 销售额(万元) 同比增长率
1月 ¥36.00 10%
2月 ¥25.00 8%
3月 ¥36.12 20%
4月 ¥69.30 50%
5月 ¥26.90 15%
6月 ¥32.00 11%
7月 ¥45.00 26%
8月 ¥56.00 13%
9月 ¥25.60 4%
10月 ¥36.21 5%
11月 ¥25.00 7%
12月 ¥59.00 30%
import pandas as pd
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['Microsoft YaHei']
plt.rcParams['axes.unicode_minus'] = False
data = pd.read_excel('销售业绩表.xlsx')
x = data['月份']
y1 = data['销售额(万元)']
y2 = data['同比增长率']
plt.bar(x, y1, color = 'c', label = '销售额(万元)')
plt.legend(loc = 'upper left', fontsize = 15) # 使用twinx()函数为图表添加次坐标轴
plt.twinx()
plt.plot(x, y2, color = 'r', linewidth = 3, label = '同比增长率')
plt.legend(loc = 'upper right', fontsize = 15)
plt.show()

输出结果:

直方图

直方图用于展示数据的分布情况,使用Matplotlib模块中的hist()函数可以绘制直方图

客户年龄统计表.zip

import pandas as pd
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['Microsoft YaHei']
plt.rcParams['axes.unicode_minus'] = False
data = pd.read_excel('客户年龄统计表.xlsx')
x = data['年龄']
plt.hist(x, bins = 9)
plt.xlim(15, 60)
plt.ylim(0, 40)
plt.title('年龄分布直方图', fontsize = 20)
plt.xlabel('年龄')
plt.ylabel('人数')
plt.grid(b = True, linestyle = 'dotted', linewidth = 1)
plt.show()

输出结果

雷达图

雷达图可以同时比较和分析多个指标。该图表可以看成一条或多条闭合的折线,因此,使用绘制折线图的plot()函数也可以绘制雷达图。

汽车性能指标分值统计表.xlsx

性能评价指标 A品牌 B品牌 C品牌
动力性 1 3 10
燃油经济性 2 6 7
制动性 1 10 5
操控稳定性 3 10 2
行驶平顺性 2 6 1
通过性 4 7 2
安全性 8 2 1
环保性 9 1 3
方便性 10 3 0
舒适性 8 2 1
经济性 4 1 10
容量性 2 2 8

代码如下:

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
data = pd.read_excel('汽车性能指标分值统计表.xlsx') data = data.dropna(axis=1)
data = data.set_index('性能评价指标')
data = data.T
data.index.name = '品牌' def plot_radar(data, feature):
columns = ['动力性', '燃油经济性', '制动性', '操控稳定性', '行驶平顺性', '通过性', '安全性', '环保性', '方便性', '舒适性', '经济性', '容量性']
colors = ['r', 'g', 'y'] # 设置雷达图的角度,用于平分切开一个平面
# linspace(1,10,x) 创建1-10的等差数组,个数为 x,默认50个;endpoint参数指定是否包含终值,默认值为True,即包含终值。
angles = np.linspace(0.1 * np.pi, 2.1 * np.pi, len(columns), endpoint = False) # 使雷达图封闭起来
angles = np.concatenate((angles, [angles[0]])) # figsize:指定figure的宽和高,单位为英寸;
figure = plt.figure(figsize = (6, 6)) # 设置为极坐标格式;subplot(nrows,ncols,sharex,sharey,subplot_kw,**fig_kw)创建单个子图,下面两句效果相同
ax = figure.add_subplot(111, polar=True)
# ax = figure.add_subplot(1, 1, 1, projection = 'polar') for i, c in enumerate(feature):
stats = data.loc[c] stats = np.concatenate((stats, [stats[0]])) ax.plot(angles, stats, '-', linewidth = 2, c = colors[i], label = str(c))
ax.fill(angles, stats, color = colors[i], alpha = 0.75) # bbox_to_anchor这个参数,可以把图例放在图外面
# bbox_to_anchor:表示legend的位置,前一个表示左右,后一个表示上下。
# 当使用这个参数时。loc将不再起正常的作用,ncol=3表示图例三列显示。
ax.legend(loc = 4, bbox_to_anchor = (1.15, -0.07)) #设置极轴范围
ax.set_ylim(0,10)
# ax.set_yticklabels([2, 4, 6, 8, 10]) # 添加每个特质的标签
columns = np.concatenate((columns, [columns[0]]))
ax.set_thetagrids(angles*180/np.pi, columns, fontsize = 12) #添加标题
plt.title('汽车性能指标雷达图') plt.show()
return figure
figure = plot_radar(data, ['A品牌', 'B品牌', 'C品牌'])
# figure = plot_radar(data, ['B品牌'])

树状图

树状图通过矩形的面积、排列和颜色直观地展示多个项目的数据比例关系。要绘制该图表,需结合使用Matplotlib模块与squarify模块。

import squarify as sf
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['Microsoft YaHei']
plt.rcParams['axes.unicode_minus'] = False
x = ['上海', '北京', '重庆', '成都', '南京', '青岛', '长沙', '武汉', '深圳']
y = [260, 45, 69, 800, 290, 360, 450, 120, 50]
colors = ['lightgreen', 'pink', 'yellow', 'skyblue', 'cyan', 'silver', 'lightcoral', 'orange', 'violet']
percent = ['11%', '2%', '3%', '33%', '12%', '15%', '18%', '5%', '2%']
chart = sf.plot(sizes = y, label = x, color = colors, value = percent, edgecolor = 'white', linewidth = 2)
plt.title(label = '城市销售额分布及占比图',fontdict = {'family' : 'KaiTi', 'color' : 'k', 'size' : 25})
plt.axis('off')
plt.show()

箱形图

箱形图是一种用于展示数据的分布情况的统计图,因形状如箱子而得名。使用Matplotlib模块中的boxplot()函数可以绘制箱形图。

数据

日期 成都 上海 北京 重庆 南京
1月1日 25 50 52 25 50
1月2日 12 58 56 26 56
1月3日 26 60 100 78 58
1月4日 23 78 125 45 87
1月5日 18 36 108 46 50
1月6日 15 69 100 50 60
1月7日 19 41 85 53 26
1月8日 20 52 85 61 36
1月9日 26 53 87 87 69
1月10日 27 69 86 25 78
1月11日 28 78 45 16 75
1月12日 54 80 78 69 80
1月13日 50 52 73 68 81
1月14日 51 26 62 45 45
1月15日 52 28 65 40 65
1月16日 36 57 90 50 63
1月17日 38 56 96 60 69
1月18日 45 89 94 36 64
1月19日 40 84 25 52 65
1月20日 41 85 36 54 45
1月21日 26 80 68 58 52
1月22日 29 75 78 56 59
1月23日 36 50 70 52 80
1月24日 33 25 52 57 29
1月25日 31 36 51 69 36
1月26日 15 64 58 54 29
1月27日 18 56 68 25 90
1月28日 25 54 78 36 78
1月29日 14 50 90 78 71
1月30日 39 44 95 56 75
1月31日 48 49 84 25 76
import pandas as pd
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['Microsoft YaHei']
plt.rcParams['axes.unicode_minus'] = False
data = pd.read_excel('1月销售统计表.xlsx')
x1 = data['成都']
x2 = data['上海']
x3 = data['北京']
x4 = data['重庆']
x5 = data['南京']
x = [x1, x2, x3, x4, x5]
labels = ['成都', '上海', '北京', '重庆', '南京'] # 参数vert用于设置箱形图的方向,True表示纵向展示,False表示横向展示;参数showmeans用于设置是否显示均值,True表示显示均值,False表示不显示均值。
plt.boxplot(x, vert = True, widths = 0.5, labels = labels, showmeans = True )
plt.title('各地区1月销售额箱形图', fontsize = 20)
plt.ylabel('销售额(万元)')
plt.show()

箱形图中的5条横线和1个点所代表的含义如下:

  • 下限:指所有数据中的最小值;
  • 下四分位数:又称“第一四分位数”,指将所有数据从小到大排列后第25%的值;
  • 中位数:又称“第二四分位数”,指将所有数据从小到大排列后第50%的值;
  • 上四分位数:又称“第三四分位数”,指将所有数据从小到大排列后第75%的值;
  • 上限:指所有数据中的最大值;
  • 点:指所有数据的平均值。

玫瑰图

玫瑰图可反映多个维度的数据,它将柱形图转化为饼图,在圆心角相同的情况下,以扇面长度展示指标大小。要绘制玫瑰图,也要用到绘制柱形图的bar()函数。

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 # 将风速的分布设置为4个区间
index = ['0~0.5', '0.6~2.0', '2.1~4.0', '4.1~6.0'] # 设置了16个方向
columns = ['N', 'NNE', 'NE', 'ENE', 'E', 'ESE', 'SE', 'SSE', 'S', 'SSW', 'SW', 'WSW', 'W', 'WNW', 'NW', 'NNW'] # seed()函数用于产生相同的随机数
np.random.seed(0) # 创建一个4行16列的DataFrame,其中的数据是30~300范围内的随机数,行标签为第6行代码设置的风速分布区间,列标签为第7行代码设置的方向。
data = pd.DataFrame(np.random.randint(30, 300, (4, 16)), index = index, columns = columns)
N = 16 # 生成16个方向的角度值
theta = np.linspace(0, 2 * np.pi, N, endpoint = False) # 用于计算扇面的宽度
width = np.pi / N
labels = list(data.columns)
plt.figure(figsize = (6, 6))
ax = plt.subplot(1, 1, 1, projection = 'polar')
for i in data.index:
radius = data.loc[i]
# 使用bar()函数绘制玫瑰图中的16根柱子,也就是扇面,参数bottom用于设置每根柱子底部的位置,这里设置为0.0,表示从圆心开始绘制。
ax.bar(theta, radius, width = width, bottom = 0.0, label = i, tick_label = labels) # 设置0°的方向为“N”,即北方
ax.set_theta_zero_location('N') # 设置按逆时针方向排列各个柱子
ax.set_theta_direction(-1)
plt.title('各方向风速频数玫瑰图', fontsize = 20)
plt.legend(loc = 4, bbox_to_anchor = (1.3, 0.2))
plt.show()

[Python] Matplotlib 图表的绘制和美化技巧的更多相关文章

  1. python matplotlib 图表局部放大

    import matplotlib.pyplot as plt from mpl_toolkits.axes_grid1.inset_locator import zoomed_inset_axes ...

  2. Python Matplotlib图表汉字显示成框框的解决办法

    http://blog.sina.com.cn/s/blog_662dcb820102vu3d.html http://blog.csdn.net/fyuanfena/article/details/ ...

  3. 一行代码让matplotlib图表变高大上

    1 简介 matplotlib作为Python生态中最流行的数据可视化框架,虽然功能非常强大,但默认样式比较简陋,想要制作具有简洁商务风格的图表往往需要编写众多的代码来调整各种参数. 而今天要为大家介 ...

  4. 【转】使用Python matplotlib绘制股票走势图

    转载出处 一.前言 matplotlib[1]是著名的python绘图库,它提供了一整套绘图API,十分适合交互式绘图.本人在工作过程中涉及到股票数据的处理如绘制K线等,因此将matplotlib的使 ...

  5. python+matplotlib 绘制等高线

    python+matplotlib 绘制等高线 步骤有七: 有一个m*n维的矩阵(data),其元素的值代表高度 构造两个向量:x(1*n)和y(1*m).这两个向量用来构造网格坐标矩阵(网格坐标矩阵 ...

  6. python matplotlib.pyplot对图像进行绘制

    imshow()是对图像进行绘制 imshow()函数格式为: matplotlib.pyplot.imshow(X, cmap=None) X: 要绘制的图像或数组. cmap: 颜色图谱(colo ...

  7. python matplotlib plot 数据中的中文无法正常显示的解决办法

    转发自:http://blog.csdn.net/laoyaotask/article/details/22117745?utm_source=tuicool python matplotlib pl ...

  8. python matplotlib 绘图基础

    在利用Python做数据分析时,探索数据以及结果展现上图表的应用是不可或缺的. 在Python中通常情况下都是用matplotlib模块进行图表制作. 先理下,matplotlib的结构原理: mat ...

  9. Python - matplotlib 数据可视化

    在许多实际问题中,经常要对给出的数据进行可视化,便于观察. 今天专门针对Python中的数据可视化模块--matplotlib这块内容系统的整理,方便查找使用. 本文来自于对<利用python进 ...

随机推荐

  1. Kali-2020 配置Docker

    Kali 2020 安装Docke 为什么在Kali上安装Docker? Kali有很多工具,但是您想运行一个不包含的工具,最干净的方法是通过Docker容器.例如,我正在研究一个名为vulhub的靶 ...

  2. Jenkins (自动使用docker容器发布java.war +tomcat)

    一.大概流程 因为目前没有找Jenkins 和docker 之间比较友好的插件,所以只能使用这种比较low 的方式来实现自动部署了. 1.Jenkins在gitlab拉取项目并编译. 2.将编译后的代 ...

  3. c++复习笔记(4)

    这一篇是另一篇各种琐碎东西的笔记. 类型转换可以通过类型转换函数,或者构造函数来实现.但是一般来说类型转换指的是类型转换函数. 类型转换函数不需要声明输出类型(因为输出类型是固定的),也没有参数,同时 ...

  4. 学习笔记 Hadoop的job提交过程,shuffle过程以及HA机制的实现

    一,在hadoop中的mapreduce的job提交过程比较繁琐,但掌握job的提交过程是我们进入深入学习的必要. 二,mapreduce的shuffle机制 三,Hadoop的HA机制.

  5. python格式转换的记录

    Python的格式转换太难了. 与其说是难,具体来说应该是"每次都会忘记该怎么处理".所以于此记录,总的来说是编码+格式转换的记录. 本文记录环境:python3.6 经常见到的格 ...

  6. [The Preliminary Contest for ICPC Asia Shanghai 2019] B-Light bulbs(差分+思维)

    前言 最近有很多算不上事的事,搞得有点心烦,补题难免就很水,没怎么搞,自我检讨一番~~ 说实话网络赛题目的质量还是挺高的,题目都设计的挺好的,很值得学习.这场比赛那会只有我们大二的在做,其他人去参加$ ...

  7. HDU6504 Problem E. Split The Tree【dsu on tree】

    Problem E. Split The Tree Problem Description You are given a tree with n vertices, numbered from 1 ...

  8. Codeforces Round #687 (Div. 2, based on Technocup 2021 Elimination Round 2) B. Repainting Street (枚举)

    题意:有\(n\)栋房子,每栋房子都有自己的颜色\(c_i\),你每次可以对连续的长度为\(k\)的区间改变任何房子的颜色,问最少多少次可以使得所有房子颜色相同. 题解:因为只有\(100\)中颜色, ...

  9. Codeforces Round #643 (Div. 2) E. Restorer Distance (贪心,三分)

    题意:给你\(n\)个数,每次可以使某个数++,--,或使某个数--另一个++,分别消耗\(a,r,m\).求使所有数相同最少的消耗. 题解:因为答案不是单调的,所以不能二分,但不难发现,答案只有一个 ...

  10. Is It A Tree? POJ - 1308

    题意: 题目给你一组单向边,当遇到输入0 0就证明这是一组边,当遇到-1 -1就要停止程序.让你判断这是不是一棵树 题解: 题目很简单,但是程序要考虑的很多 1.因为是一颗树,所以肯定不能出现环,这个 ...