matplotlib绘制图表

简单图表的绘制

1.1 绘制折线图

使用pyplot的plot()函数可以绘制具有多个线条的折线图,通过以下任意一种方式均可以完成。

plot(x, y, fmt, scalex=True, scaley=True, data=None, label=None, *args, **kwargs) 

x:表示x轴的数据,默认值为range(len(y))。

y:表示y轴的数据。

fmt:表示快速设置线条样式的格式字符串。

label:表示应用于图例的标签文本。

plot()函数会返回一个包含Line2D类对象(代表线条)的列表。

第一种

plt.plot(x1, y1)
plt.plot(x2, y2)

第二种

plt.plot(x1, y1, x2, y2) 

第三种

arr = np.array([[1, 2, 3], 
                [4, 5, 6], 
                [7, 8, 9],
                [10, 11, 12]])
plt.plot(arr[0], arr[1:]) 

绘制折线图

import matplotlib.pyplot as plt #导入matplotlib包下的pyplot并命名为plt函数
import numpy as np

#使用matplotlib绘制第一个图表
data =np.array([1,2,3,4,5])     #准备数据
fig=plt.figure()                #创建画布
ax=fig.add_subplot(111)         #添加绘图区域
ax.plot(data)                   #绘制图标
plt.show()                      #展示图标

请添加图片描述

1.2绘制柱形图或堆积柱形图

bar()函数会返回一个BarContainer类的对象。

•BarContainer类的对象是一个包含柱形或误差棒的容器,它亦可以视为一个元组,可以遍历获取每个柱形或误差棒。

•BarContainer类的对象也可以访问patches或errorbar属性分别获取图表中所有的柱形或误差棒。

绘制有一组柱形的柱形图

import matplotlib.pyplot as plt
import numpy as np

x = np.arange(5)
y1 = np.array([10, 8, 7, 11, 13])
# 柱形的宽度
bar_width = 0.3
# 绘制柱形图
plt.bar(x, y1, tick_label=['a', 'b', 'c', 'd', 'e'], width=bar_width)
plt.show()

请添加图片描述

绘制有两组柱形的柱形图

import matplotlib.pyplot as plt
import numpy as np

x = np.arange(5)
y1 = np.array([10, 8, 7, 11, 13])
y2 = np.array([9, 6, 5, 10, 12])
# 柱形的宽度
bar_width = 0.3
# 根据多组数据绘制柱形图
plt.bar(x, y1, tick_label=['a', 'b', 'c', 'd', 'e'], width=bar_width)
plt.bar(x+bar_width, y2, width=bar_width)
plt.show()

在这里插入图片描述
绘制堆积柱形图

在使用bar()函数绘制图表时,可以通过给该函数的bottom参数传值的方式控制柱形的y值,使后绘制的柱形位于先绘制的柱形的上方。

import matplotlib.pyplot as plt
import numpy as np

x = np.arange(5)
y1 = np.array([10, 8, 7, 11, 13])
y2 = np.array([9, 6, 5, 10, 12])
# 柱形的宽度
bar_width = 0.3
# 绘制堆积柱形图
plt.bar(x, y1, tick_label=['a', 'b', 'c', 'd', 'e'], width=bar_width)
plt.bar(x, y2, bottom=y1,width=bar_width)
plt.show()

在这里插入图片描述

绘制有误差棒的柱形图

在使用bar()函数绘制图表时,还可以通过给xerr、yerr参数传值的方式为柱形添加误差棒。

import matplotlib.pyplot as plt
import numpy as np

x = np.arange(5)
y1 = np.array([10, 8, 7, 11, 13])
y2 = np.array([9, 6, 5, 10, 12])
# 柱形的宽度
bar_width = 0.3
# 偏差数据
error = [2, 1, 2.5, 2, 1.5]
# 绘制带有误差棒的柱形图
plt.bar(x, y1, tick_label=['a', 'b', 'c', 'd', 'e'], width=bar_width)
plt.bar(x, y1, bottom=y1, width=bar_width, yerr=error)
plt.show()

在这里插入图片描述

1.3绘制条形图或堆积条形图

使用pyplot的barh()函数可以快速地绘制条形图或堆积条形图 。

barh(y, width, height=0.8, left=None, align='center', *, **kwargs) 

y:表示条形的y值。

width:表示条形的宽度。

height:表示条形的高度,默认值为0.8。

left:条形左侧的x坐标值,默认值为0。

align:表示条形的对齐方式,默认值为“center”,即条形与刻度线居中对齐。

tick_label:表示条形对应的刻度标签。

xerr,yerr:若未设为None,则需要为条形图添加水平/垂直误差棒。

barh()函数会返回一个BarContainer类的对象。

绘制有一组条形的条形图

import matplotlib.pyplot as plt
import numpy as np

y = np.arange(5)
x1 = np.array([10, 8, 7, 11, 13])
# 条形的高度
bar_height = 0.3
# 绘制条形图
plt.barh(y, x1, tick_label=['a', 'b', 'c', 'd', 'e'], height=bar_height)
plt.show()

在这里插入图片描述

绘制有两组条形的条形图

import matplotlib.pyplot as plt
import numpy as np


y = np.arange(5)
x1 = np.array([10, 8, 7, 11, 13])
x2 = np.array([9, 6, 5, 10, 12])
bar_height = 0.3
plt.barh(y, x1, tick_label=['a', 'b', 'c', 'd', 'e'], height=bar_height)
plt.barh(y+bar_height, x2,height=bar_height)
plt.show()

在这里插入图片描述
绘制堆积条形图

在使用barh()函数绘制图表时,可以通过给left参数传值的方式控制条形的x值,使后绘制的条形位于先绘制的条形右方。

import matplotlib.pyplot as plt
import numpy as np

y = np.arange(5)
x1 = np.array([10, 8, 7, 11, 13])
x2 = np.array([9, 6, 5, 10, 12])
bar_height = 0.3
# 绘制堆积条形图
plt.barh(y, x1, tick_label=['a', 'b', 'c', 'd', 'e'], height=bar_height)
plt.barh(y, x2, left=x1, height=bar_height)
plt.show()

在这里插入图片描述

绘制有误差棒的条形图

在使用barh()函数绘制图表时,可以通过给xerr、yerr参数传值的方式为条形添加误差棒。

import matplotlib.pyplot as plt
import numpy as np

y = np.arange(5)
x1 = np.array([10, 8, 7, 11, 13])
x2 = np.array([9, 6, 5, 10, 12])
bar_height = 0.3
# 偏差数据
error = [2, 1, 2.5, 2, 1.5]
# 绘制带有误差棒的条形图
plt.barh(y, x1, tick_label=['a', 'b', 'c', 'd', 'e'], height=bar_height)
plt.barh(y, x2, left=x1, height=bar_height, xerr=error)
plt.show()

在这里插入图片描述

1.4绘制堆积面积图

使用pyplot的stackplot()函数可以快速地绘制堆积面积图 。

语法

stackplot(x, y,labels=(), baseline='zero', data=None, *args, **kwargs) 

x:表示x轴的数据,可以是一维数组。

y:表示y轴的数据,可以是二维数组或一维数组序列。

labels:表示每个填充区域的标签。

baseline:表示计算基线的方法,包括zero、sym、wiggle和weighted_wiggle。其中zero表示恒定零基线,即简单的叠加图;sym表示对称于零基线;wiggle表示最小化平方斜率之和;weighted_wiggle表示执行相同的操作,但权重用于说明每层的大小。

绘制有三个填充区域堆叠的堆积面积图

import matplotlib.pyplot as plt
import numpy as np

x = np.arange(6)
y1 = np.array([1,4,3,5,6,7])
y2 = np.array([1,3,4,2,7,6])
y3 = np.array([3,4,3,6,5,5])
# 绘制堆积面积图
plt.stackplot(x, y1, y2, y3)
plt.show()

在这里插入图片描述

1.5绘制直方图

使用pyplot的hist()函数可以快速地绘制直方图 。

语法

hist(x, bins=None, range=None, density=None, weights=None, 
       bottom=None,  **kwargs) 

x:表示x轴的数据。

bins:表示矩形条的个数,默认为10。

range:表示数据的范围,若未设置范围,默认数据范围为(x.min(), x.max())。

cumulative:表示是否计算累计频数或频率。

histtype:表示直方图的类型,支持’bar’、‘barstacked’、‘step’、'stepfilled‘四种取值,其中’bar’为默认值,代表传统的直方图;'barstacked’代表堆积直方图;'step’代表未填充的线条直方图;'stepfilled’代表填充的线条直方图。

align:表示矩形条边界的对齐方式,可设置为’left’、‘mid’或’right’,默认为’mid’。

orientation:表示矩形条的摆放方式,默认为’vertical’,即垂直方向。

rwidth:表示矩形条宽度的百分比,默认为0。若histtype的值为’step’或’stepfilled’,则直接忽略rwidth参数的值。

stacked:表示是否将多个矩形条以堆叠形式摆放。

绘制填充的线条直方图

import matplotlib.pyplot as plt
import numpy as np

# 准备50个随机测试数据
scores = np.random.randint(0,100,50)
# 绘制直方图
plt.hist(scores, bins=8, histtype='stepfilled')
plt.show()

请添加图片描述
人脸识别的灰度直方图

本实例要求使用一组10000个随机数作为人脸图像的灰度值,使用hist()函数绘制下图所示的灰度直方图。

import matplotlib.pyplot as plt
import numpy as np


# 10000个随机数
random_state = np.random.RandomState(19680801)
radom_x = random_state.randn(10000)
# 绘制包含25个矩形条的直方图
plt.hist(radom_x, bins=25)
plt.show()

在这里插入图片描述

1.6绘制饼图或圆环图

使用pyplot的pie()函数可以快速地绘制饼图或圆环图 。

pie(x, explode=None, labels=None, autopct=None, pctdistance=0.6, 
      startangle=None, *, data=None) 

x:表示扇形或楔形的数据。

explode:表示扇形或楔形离开圆心的距离。

labels:表示扇形或楔形对应的标签文本。

autopct:表示控制扇形或楔形的数值显示的字符串,可通过格式字符串指定小数点后的位数。

pctdistance:表示扇形或楔形对应的数值标签距离圆心的比例,默认为0.6。

shadow:表示是否显示阴影。

labeldistance:表示标签文本的绘制位置(相对于半径的比例),默认为1.1。

startangle:表示起始绘制角度,默认从x轴的正方向逆时针绘制。

radius:表示扇形或楔形围成的圆形半径。

wedgeprops:表示控制扇形或楔形属性的字典。例如,通过wedgeprops = {‘width’: 0.7} 将楔形的宽度设为0.7。

textprops:表示控制图表中文本属性的字典。

center:表示图表的中心点位置,默认为(0,0)。

frame:表示是否显示图框。

绘制饼图

import matplotlib.pyplot as plt
import numpy as np

data = np.array([20, 50, 10, 15, 30, 55])
pie_labels = np.array(['A', 'B', 'C', 'D', 'E', 'F'])
# 绘制饼图:半径为0.5,数值保留1位小数
plt.pie(data, radius=1.5, labels=pie_labels, autopct='%3.1f%%')
plt.show()

在这里插入图片描述

绘制圆环图

data = np.array([20, 50, 10, 15, 30, 55])
pie_labels = np.array(['A', 'B', 'C', 'D', 'E', 'F'])
# 绘制圆环图
plt.pie(data, radius=1.5, wedgeprops={‘width’: 0.7}, 
           labels=pie_labels, autopct='%3.1f%%,      
           pctdistance=0.75) 

请添加图片描述

1.7 绘制散点图或气泡图

使用pyplot的scatter()函数可以快速地绘制散点图或气泡图 。

语法:

scatter(x, y, s=None, c=None, marker=None, cmap=None, linewidths=None, edgecolors=None, *, **kwargs) 

x,y:表示数据点的位置。

s:表示数据点的大小。

c:表示数据点的颜色。

marker:表示数据点的样式,默认为圆形。

alpha:表示透明度,可以取值为0~1。

linewidths:表示数据点的描边宽度。

edgecolors:表示数据点的描边颜色。

绘制散点图

import  matplotlib.pyplot as plt
import numpy as np

num = 50
x = np.random.rand(num)
y = np.random.rand(num)
plt.scatter (x, y)
plt.show()

请添加图片描述
绘制气泡图

import matplotlib.pyplot as plt
import numpy as np

num = 50
x = np.random.rand(num)
y = np.random.rand(num)
area = (30 * np.random.rand(num))**2
plt.scatter(x, y, s=area)
plt.show()

请添加图片描述

1.8 绘制箱型图

使用pyplot的boxplot()函数可以快速地绘制箱形图。

语法:

boxplot(x, notch=None, sym=None, vert=None, whis=None, positions=None, widths=None, *, data=None)

x:绘制箱形图的数据。

sym:表示异常值对应的符号,默认为空心圆圈。

vert:表示是否将箱形图垂直摆放,默认为垂直摆放。

whis:表示箱形图上下须与上下四分位的距离,默认为1.5倍的四分位差。

positions:表示箱体的位置。

widths:表示箱体的宽度,默认为0.5。

patch_artist:表示是否填充箱体的颜色,默认不填充。

meanline:是否用横跨箱体的线条标出中位数,默认不使用。

showcaps:表示是否显示箱体顶部和底部的横线,默认显示。

showbox:表示是否显示箱形图的箱体,默认显示。

showfliers:表示是否显示异常值,默认显示。

labels:表示箱形图的标签。

boxprops:表示控制箱体属性的字典。

绘制不显示异常值的箱形图

import matplotlib.pyplot as plt
import numpy as np

data = np.random.randn(100)
plt.boxplot(data, eanline=True, widths=0.3, patch_artist=True,
showfliers=False)
plt.show()

请添加图片描述

使用pyplot的polar()函数可以快速地绘制雷达图。

polar(theta, r, **kwargs) 

theta:表示每个数据点所在射线与极径的夹角。

r:表示每个数据点到原点的距离。

霍兰德人雷达图

import numpy as np
import matplotlib.pyplot as plt
import matplotlib

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

radar_labels = np.array(['研究型(I)', '艺术性(A)', '社会性(S)', '企业型(E)', '常规性(C', '现实型(R)'])
data = np.array([[0.4, 0.32, 0.35, 0.30, 0.30, 0.88],
                 [0.85, 0.35, 0.30, 0.40, 0.40, 0.30],
                 [0.43, 0.89, 0.30, 0.28, 0.22, 0.30],
                 [0.30, 0.25, 0.48, 0.85, 0.45, 0.40],
                 [0.20, 0.38, 0.87, 0.85, 0.45, 0.40],
                 [0.34, 0.31, 0.38, 0.40, 0.92, 0.28]])
data_labels = ('艺术家', '实验员', '工程师', '推销员', '社会工作者', '记事员')
angles = np.linspace(0, 2 * np.pi, 6, endpoint=False)  # 设置雷达图的角度,用于平切开一个圆面
'''
np.linspace(start.stop, num,endpoint=Ture)
参数:
    start:scalar(标量) 序列的起始点
    stop:scalar(标量) 序列的结束点
    num:int 生成的样本数,默认是50。必须是非负
    endpoint:bool 如果是真,则一定包括stop,如果为False,一定不会有stop
'''
data = np.concatenate((data, [data[0]]))
angles = np.concatenate((angles, [angles[0]]))
'''
np.concatenate((arr,arr),axis=1)
参数:(数据源1,数据源2),axis是方向:1是行,0是列
注意:
    1.级联的参数是列表,一定要加中括号或小括号
    2.维度必须相同
    3.性状相符:在维度保持一致的前提下,
        如果进行横向(axis=1)级联,必须保证进行级联的数组行数保持一致
        如果进行纵向(axis=0)级联,必须保证进行级联的数组列数保持一致
    4.可通过axis参数改变级联的方向
'''
fig = plt.figure(facecolor='white')
'''
figure(num-None,figsize=None,dpi=None,facecolor=None,edgecolor=None,frameon=True)
    num:图像编号或名称,数字为编号,字符串为名称
    figsize:指定figure的宽和高,单位为英寸
    dpi:指定绘图对象的分辨率,即每英寸多少像素,缺省值 为80
    facecolor:背景的颜色
    edgecolor:边框的颜色
    frameon:是否显示边框
'''
plt.subplot(111, polar=True)
'''
subplot(nrows,ncols,plot_number)
这个函数用来表示把figure分成nrows*ncols的子图表示
nrows:子图的行数
ncols:子图的列数
plot_numbel:索引值,表示把图画在第plot_number个位置
plt.subplot(232),将figure分成2*3=6个子图区域,第三个参数2表示将生成的图画在第二个位置
'''
plt.plot(angles, data, 'o-', linewidth=1, alpha=0.2)
'''
plt.plot(x,y,format_string,**kwargs)
    x: x轴数据,列表或数组,可选
    y:y轴数据,列表或数组
    format_string:控制曲线的格式字符串,可选
    **kwargs:第二组或更多,可画多条曲线
'''
plt.fill(angles, data, alpha=0.25)  # 区域填充的函数
plt.thetagrids(angles * 180 / np.pi)  # numpy中数学函数的三角函数
plt.figtext(0.52, 0.95, '霍兰德人格分析', ha='center', size=20)
'''
0.52:表示横坐标
0.95:表示纵坐标
’霍兰德人格分析‘:表示要添加的文本内容
ha:水平对齐
va:垂直对齐
fontsize:文本字体大小
'''
legend = plt.legend(data_labels, loc=(0.95, 0.80), labelspacing=0.1)
plt.setp(legend.get_texts(), fontsize='large')
plt.grid(True)
plt.savefig('holland_radar.jpg')
plt.show()

请添加图片描述

2.0 绘制误差棒图

使用pyplot的errorbar()函数可以快速地绘制误差棒图。

语法:

errorbar(x, y, yerr=None, xerr=None, fmt='', ecolor=None,  *, data=None, **kwargs) 

x,y:表示数据点的位置。

xerr,yerr:表示数据的误差范围。

fmt:表示数据点的标记样式和数据点之间连接线的样式。

elinewidth:表示误差棒的线条宽度。

capsize:表示误差棒边界横杆的大小。

capthick:表示误差棒边界横杆的厚度。

绘制误差棒图

import matplotlib.pyplot as plt
import numpy as np

x = np.arange(5)
y = (25, 32, 34, 20, 25)
y_offset = (3, 5, 2, 3, 3)
plt.errorbar(x, y, yerr=y_offset, capsize=3, capthick=2)
plt.show()

请添加图片描述

图表样式美化

表格数据来源:

import matplotlib.pyplot as plt
import matplotlib as mpl
import pandas as pd

mpl.rcParams['font.sans-serif'] = ['SimHei']  # 设置简黑字体
mpl.rcParams['axes.unicode_minus'] = False  # 解决‘-’bug

datafile = 'path';
data = pd.read_excel(datafile)
# 设置画布大小
plt.figure(figsize=(10, 5))

# 设置图标标题,并给坐标轴加上标签
plt.title("不同季度各产品销售额", fontsize=24)
plt.xlabel("季度", fontsize=14)
plt.ylabel("销售额(万元)", fontsize=14)

plt.plot(data['季度'], data['产品A'], color="deeppink", linewidth=2, linestyle=':', label='产品A', marker='o')
plt.plot(data['季度'], data['产品B'], color="darkblue", linewidth=2, linestyle='--', label='产品B', marker='*')
plt.plot(data['季度'], data['产品C'], color="goldenrod", linewidth=2, linestyle='-', label='产品C', marker='+')

# 设置刻度标记的大小
plt.legend(loc=2)
plt.show()

请添加图片描述

  • 7
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小火柴127

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值