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

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. Linux环境ZooKeeper安装配置及使用

    Linux环境ZooKeeper安装配置及使用 一.ZooKeeper 1.1 zookeeper作用 1.2 zookeeper角色 1.3 zookeeper功能 二.集群规划 三.安装流程 (1 ...

  2. java切割~~百万 十万 万 千 百 十 个 角 分

    /** * @param value * @return */ @SuppressWarnings("unused") public static void convertLoan ...

  3. acid解释

    原子性A:一个事务内部的所有操作都是不可分割的,这叫原子性.一致性C:事务内部的所有操作要么都成功,要么都失败.隔离性I:事务与事务之间永远不相见.持久性D:就是说数据最终是落到磁盘永久保存的.

  4. HttpRunner(1)自我介绍

    前言 首先,我们无论学习哪个框架,都要带着问题,带着思考去学习 思考1:HttpRunner是什么? 思考2:HttpRunner的设计模式是什么? 思考3:为什么我们要学习HttpRunner?他的 ...

  5. Could not transfer artifact org.apache.maven.plugins:maven-clean-plugin:pom:2.5 from 这类问题的解决方法

    最近换了台电脑,所以重新在IEDA上搭建Spring Boot环境,遇到一个问题,网上查了很久,又实践了一通,终于解决,这里把步骤详细记录下来. 问题描述:创建IDEA的Maven项目后,出现 Mav ...

  6. BZOJ-1086 [SCOI2005]王室联邦 (树分块)

    递归处理子树,把当前结点当作栈底,然后递归,回溯回来之后如果栈中结点数量到达某一个标准时,弹出栈中所有的元素分到一个块中,最后递归结束了如果栈中还有元素,那么剩下的这些元素放在新的块中 题目:BZOJ ...

  7. Luogu T10025 排列名次

    题目链接 题目描述 给定一个长度为n的排列,要求输出该排列的字典序名次(1,2,3,...,n的名次为1). 输入输出格式 输入格式: 第一行一个数n,表示排列长度. 第二行n个数,用空格分隔,表示一 ...

  8. 【noi 2.6_162】Post Office(DP)

    这题和"山区建小学"除了输入不同,其他都一样.(解析可见我的上一篇随笔) 但是,这次我对dis[][]加了一个优化,画一下图就可明白. 1 #include<cstdio&g ...

  9. 【noi 2.6_9265】取数游戏(DP)

    题意:从自然数1到N中不取相邻2数地取走任意个数,问方案数. 解法:f[i][1]表示在前i个数中选了第i个的方案数,f[i][0]表示没有选第i个.f[i][1]=f[i-1][0];  f[i][ ...

  10. 牛客编程巅峰赛S2第7场 - 钻石&王者 A.牛牛的独特子序列 (字符串,二分)

    题意:给你一个字符串,找出一个类似为\(aaabbbccc\)这样的由连续的\(abc\)构成的子序列,其中\(|a|=|b|=|c|\),问字符串中能构造出的子序列的最大长度. 题解:这题刚开始一直 ...