绘制常见类型图表

一、pyplot模块的hist()函数用于绘制直方图

matplotlib.pyplot.hist(x,bins = None,range = None,color = None,label = None, …, ** kwargs)

  • x -- 表示输入值。
  • bins – 表示绘制条柱的个数。
  • range – bins的上下范围(最大和最小值)。
  • color – 表示条柱的颜色,默认为None。
arr_random = np.random.randn(100)   # 创建随机数组-正态
plt.hist(arr_random, bins=8, color='g', alpha=0.7) # 绘制直方图
plt.show()  # 显示图形

 绘制常见类型图表_第1张图片

 实例:人脸识别的灰度直方图

  • 人脸识别技术是一种生物特征识别技术,它通过从装有摄像头的终端设备拍摄的人脸图像中抽取人的个性化特征,以此来识别人的身份
  • 灰度直方图是实现人脸识别的方法之一,它将数字图像的所有像素按照灰度值的大小统计其出现的频率
  • 本实例要求使用一组10000个随机数作为人脸图像的灰度值,使用hist()函数绘制下图所示的灰度直方图
#解决中文显示问题
plt.rcParams['font.sans-serif'] = ['KaiTi'] # 指定默认字体
plt.rcParams['axes.unicode_minus'] = False # 解决保存图像是负号'-'显示为方块的问题
# 05_face_recognition
import matplotlib.pyplot as plt
import numpy as np
# 10000 个随机数
random_state = np.random.RandomState(19680801)  #控制随机状态,相当于随机种子
random_x = random_state.randn(10000)
# 绘制包含 25个矩形条的直方图
plt.hist(random_x, bins=25)
plt.xlabel("x灰度值",fontsize=20)         # 添加x轴的名称
plt.ylabel("y频率",fontsize=20)         # 添加y轴的名称
plt.title('人脸识别的灰度直方图',fontsize=20)
plt.show()

绘制常见类型图表_第2张图片

由图可知,位于-0.5–0之间的灰度值最多,位于-4–(-3)或3–4之间的灰度值最少

二、使用scatter()绘制散点图或气泡图

matplotlib.pyplot.scatter(x,y,s=None,c=None,marker=None,alpha=None,linewidths=None,edgecolors=None, *,**kwargs)

  • x, y – 表示x轴和y轴对应的数据。
  •  s -- 指定点的大小。
  •  c -- 指定散点的颜色。
  • marker – 表示绘制的散点类型。
  • alpha – 表示点的透明度,接收0~1之间的小数
  • linewidths – 表示数据点的描边宽度。
  • edgecolors – 表示数据点的描边颜色。

 绘制散点图

# 创建包含整数0~50的数组,用于表示x轴的数据
x = np.arange(51)
# 创建另一数组,用于表示y轴的数据
y = np.random.rand(51) * 10
plt.scatter(x, y,s=12,c='red',alpha=0.5)   # 绘制散点图
plt.show()

绘制常见类型图表_第3张图片

 绘制气泡图

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)

绘制常见类型图表_第4张图片

实例:汽车速度与制动距离的关系

  • 汽车的制动距离主要取决于汽车的车速。若车速增加1倍,则汽车的制动距离将增大至近4倍
  • 某汽车生产公司对一批丰田汽车进行抽样测试,并分别记录了不同的车速对应的制动距离
  • 本实例要求根据下面的数据,将车速(km/h)列的数据作为x轴的数据,将制动距离(m)列的数据作为y轴的数据,使用scatter()函数绘制下图所示的散点图。
# 07_vehicle_speed_and_braking_distance
import numpy as np
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = 'SimHei'
plt.rcParams['axes.unicode_minus'] = False
# 准备 x 轴和 y 轴的数据
x_1 = np.arange(10,210,10)
y_1 = np.array([0.5,2.0,4.4,7.9,12.3,17.7,24.1,31.5,39.3,49.2,59.5,70.8,83.1,96.4,110.7,126.0,142.2,159.4,177.6,196.8])
# 绘制散点图
plt.scatter(x_1,y_1)
#加上标题“速度与制动距离”
plt.title("速度与制动距离")
#添加x,y轴标签
plt.xlabel('车速')
plt.ylabel('制动距离')
#显示
plt.plot

 绘制常见类型图表_第5张图片

pyplot模块中用于绘制柱状图的函数为bar()

bar(x,height,width=0.8,bottom=None,align=‘center’,tick_label=None, xerr=None, yerr=None, **kwargs)

  • x – 表示x轴的数据。
  • height – 表示条形的高度。
  • width – 表示条形的宽度,默认为0.8。
  • color – 表示条形的颜色。
  • edgecolor – 表示条形边框的颜色。
  • bottom:表示柱形底部的y值,默认为0。
  • tick_label:表示柱形对应的刻度标签。
  • xerr,yerr :若未设为None,则需要为柱形图添加水平/垂直误差棒

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

  • BarContainer类的对象是一个包含柱形或误差棒的容器,它亦可以视为一个元组,可以遍历获取每个柱形或误差棒。
  • BarContainer类的对象也可以访问patches或errorbar属性分别获取图表中所有的柱形或误差棒
# 对比两部电影1-5月份的票房收入
import numpy as np
x= np.arange(5)
y1 = [np.random.randint(20,60) for _ in range(5)]
y2 = [np.random.randint(20,60) for _ in range(5)]
y1
y2
# 确定柱子宽度
width = 0.3
plt.bar(x,y1,width=width)
plt.bar(x+width,y2,width=width)
plt.show()

绘制常见类型图表_第6张图片

# 创建包含0~4的一维数组
x = np.arange(5)
# 从上下限范围内随机选取整数,创建两个2行5列的数组
y1, y2 = np.random.randint(1, 31, size=(2, 5))
width = 0.3                                # 条形的宽度
ax = plt.subplot(1, 1, 1)                # 创建一个子图
ax.bar(x, y1, width, color='r')         # 绘制红色的柱形图
# ax.bar(x, y2, width, color='g')  # 绘制另一个绿色的柱形图
ax.bar(x+width, y2, width, color='g')  # 绘制另一个绿色的柱形图
ax.set_xticks(x+width)                    # 设置x轴的刻度
# 设置x轴的刻度标签
ax.set_xticklabels(['January', 'February', 'March', 'April ', 'May ']) 
plt.show()                                  # 显示图形

绘制常见类型图表_第7张图片

# 柱状图
# 对比两部电影1-5月份的票房收入
x = np.arange(5)
y1 = [np.random.randint(20,60) for _ in range(5)]
y2 = [np.random.randint(20,60) for _ in range(5)]
# 绘制有一组柱形的柱形图 确定柱子的宽度
width = 0.3
plt.bar(x, y1,width=width)

绘制常见类型图表_第8张图片

plt.bar(x, y2,width=width,color='red')

 绘制常见类型图表_第9张图片

# 绘制有两组柱形的柱形图
plt.bar(x, y1,width=width)
plt.bar(x, y2,width=width)

绘制常见类型图表_第10张图片

# 正确绘制有两组柱形的柱形图
plt.bar(x, y1,width=width)
plt.bar(x+width, y2,width=width)

四、绘制堆积柱形图

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

# 绘制堆积柱形图
x = np.arange(5)
y1 = [np.random.randint(20,60) for _ in range(5)]
y2 = [np.random.randint(20,60) for _ in range(5)]
plt.bar(x, y1, tick_label=['a', 'b', 'c', 'd', 'e'], width=width)
plt.bar(x, y2, bottom=y1, width=width)
plt.show()

绘制常见类型图表_第11张图片

 五、绘制有误差棒的柱形图

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

# 偏差数据
error = [4, 2, 5, 3.5, 3]
# 绘制带有误差棒的柱形图
plt.bar(x, y1, tick_label=['a', 'b', 'c', 'd', 'e'], width=width)
plt.bar(x, y1, bottom=y1, width=width, yerr=error)
plt.show()

绘制常见类型图表_第12张图片

 实例:2013~2019财年阿里巴巴淘宝和天猫平台的GMV(Gross Merchandise Volume,主要是指网站的成交金额)

        随着互联网与电子商务的快速发展,人们的消费模式发生了翻天覆地的变化,越来越多的消费者选择网络购物,省时省力。
        本实例要求根据数据,将财年列的数据作为x轴数据,将GMV列的数据作为y轴数据,使用bar()函数绘制下图所示的柱形图。

# 02_taobao_and_tianmao_GMV
import matplotlib.pyplot as plt
import numpy as np
plt.rcParams['font.sans-serif'] = 'SimHei'
plt.rcParams['axes.unicode_minus'] = False
x = np.array([2013,2014,2015,2016,2017,2018,2019])
y = np.array([10770, 16780, 24440, 30920, 37670, 48200, 57270])
# 绘制柱形图
width = 0.3
plt.bar(x,y,width=width)
    # 添加标题,"阿里巴巴GMV",字体大小25
plt.title('阿里巴巴GMV',fontsize=25)
        # 添加x轴的名称"x财年",字体大小20
plt.xlabel('x财年',fontsize=20)
         # 添加y轴的名称"yGMV(亿元)",字体大小20
plt.ylabel('yGMV(亿元)',fontsize=20)
#绘图
plt.show()

绘制常见类型图表_第13张图片

 分析:2013~2019财年的成交总额逐年增加,至2019年已经达到近60000亿元。

 六、使用plot()绘制折线图

使用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类对象(代表线条)的列表

    使用pyplot的plot()函数还可以绘制具有多个线条的折线图

 未来15天最高气温和最低气温

#解决中文显示问题
plt.rcParams['font.sans-serif'] = ['KaiTi'] # 指定默认字体
plt.rcParams['axes.unicode_minus'] = False # 解决保存图像是负号'-'显示为方块的问题
# 01_maximum_minimum_temperatures
import matplotlib.pyplot as plt
import numpy as np
x = np.arange(4, 19)
y_max = np.array([32, 33, 34, 34, 33, 31, 30, 29, 30, 29, 26, 23, 21, 25, 31])
y_min = np.array([19, 19, 20, 22, 22, 21, 22, 16, 18, 18, 17, 14, 15, 16, 16])
plt.title("气温变化",fontsize=25)      # 添加标题
plt.xlabel("x日期",fontsize=20)         # 添加x轴的名称
plt.ylabel("y温度",fontsize=20)         # 添加y轴的名称
# 绘制折线图
# plt.plot(x, y_max)
# plt.plot(x, y_min)
plt.plot(x, y_max, x, y_min)  # 绘制多个线条的折线
plt.show()

绘制常见类型图表_第14张图片

 七、使用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 numpy as np
import matplotlib.pyplot as plt
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()

绘制常见类型图表_第15张图片

 九、绘制有两组条形的条形图

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()

绘制常见类型图表_第16张图片

 十、绘制堆积条形图

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

# 绘制堆积条形图
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()

绘制常见类型图表_第17张图片

 绘制有误差棒的条形图

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

# 偏差数据
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()

绘制常见类型图表_第18张图片

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

网络购物已经成为人们日常生活的一部分,它在创造新的消费方式的同时,也在改变着人们的消费模式和习惯,成为拉动居民消费的重要渠道。

  • 国家统计局抽取了771个样本,并根据这些样本测算用户网购替代率(网购用户线上消费对线下消费的替代比率)的情况
  • 本实例要求根据下表的数据,将商品种类列的数据作为y轴的刻度标签,将替代率列的数据作为x轴数据,使用barh()函数绘制下图所示的条形图
# 03_substitution_rate_online
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])
y = np.arange(1, 10)
labels = ["家政、家教、保姆等生活服务", "飞机票、火车票", "家具", "手机、手机配件", 
          "计算机及其配套产品", "汽车用品", "通信充值、游戏充值", "个人护理用品", 
          "书报杂志及音像制品"]
# 绘制条形图
plt.title("各商品种类的网购替代率",fontsize=25)      # 添加标题
plt.xlabel("x网购替代率",fontsize=20)         # 添加x轴的名称
plt.ylabel("y各类商品",fontsize=20)         # 添加y轴的名称
plt.barh(y, x, tick_label=labels, align="center", height=0.6)
plt.show()

绘制常见类型图表_第19张图片

         由图可知,工艺品、收藏品的网购替代率最低,家政、家教、保姆等生活服务的网购替代率最高。

十二、 用stackplot()绘制堆积面积图

使用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 numpy as np
import matplotlib.pyplot as plt
fig1 = plt.figure()
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()

绘制常见类型图表_第20张图片

 实例:物流公司物流费用统计

        近些年我国物流行业蓬勃房展,目前已经有近几千家物流公司,其中部分物流公司大打价格战,以更低的价格吸引更多的客户,从而抢占市场份额
        近些年我国物流行业蓬勃房展,目前已经有近几千家物流公司,其中部分物流公司大打价格战,以更低的价格吸引更多的客户,从而抢占市场份额
        本实例要求根据数据,将月份列的数据作为x轴的刻度标签,将A公司、B公司、C公司这三列数据作为y轴的数据,使用 stackplot()函数绘制下图所示的 堆积面积图
# 04_logistics_cost_statistics
import numpy as np
import matplotlib.pyplot as plt
# plt.figure(figsize=(20,8),dpi=100)  # 提高清晰度
x = np.arange(1, 13)
y_a = np.array([198, 215, 245, 222, 200, 236, 201, 253, 236, 200, 266, 290])
y_b = np.array([203, 236, 200, 236, 269, 216, 298, 333, 301, 349, 360, 368])
y_c = np.array([185, 205, 226, 199, 238, 200, 250, 209, 246, 219, 253, 288])
# 绘制堆积面积图
plt.stackplot(x, y_a, y_b, y_c)
# plt.legend(kinds, loc='upper right', bbox_to_anchor=[1.3, 1.1])  
# plt.legend(lines, ['正弦', '余弦'], shadow=True, fancybox=True)
plt.title('物流公司物流费用统计',fontsize=20)
plt.xlabel("月份",fontsize=20)         # 添加x轴的名称
plt.ylabel("物流费用(万元)",fontsize=20)         # 添加y轴的名称
lines = plt.stackplot(x, y_a, y_b, y_c)
plt.legend(lines, ["A公司", "B公司","C公司"], shadow=True, fancybox=True) # 添加图例
plt.show()

绘制常见类型图表_第21张图片

         从图中看出,B公司的物流费用呈现明显的增长趋势, A公司和C公司的物流费用呈现平缓的波动趋势。

十四、使用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 numpy as np
import matplotlib.pyplot as plt
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()

绘制常见类型图表_第22张图片

 绘制圆环图

import numpy as np
import matplotlib.pyplot as plt
data = np.array([20, 50, 10, 15, 30, 55])
pie_labels = np.array(['A', 'B', 'C', 'D', 'E', 'F'])
# 绘制圆环图:外圆半径为1.5,楔形宽度为0.7
plt.pie(data, radius=1.5, wedgeprops={'width': 0.7}, labels=pie_labels,
        autopct='%3.1f%%', pctdistance=0.75)
plt.show()

绘制常见类型图表_第23张图片

实例:支付宝月账单报告

  • 人们的生活发生了翻天覆地的变化,无论是到超市选购商品,还是跟朋友聚餐,或是来一场说走就走的旅行,都可以使用移动支付App轻松完成支付,非常便捷
  • 支付宝是人们使用较多的支付方式,它拥有自动记录每月账单的功能,可以方便用户了解每月资金的流动情况。
  • 本实例要求根据下表的数据,将分类列的数据作为饼图的标签,将各分类对应的金额与总支出金额的比例作为饼图的数据,使用pie()函数绘制下图所示的饼图
# 06_monthly_bills_of_alipay
import matplotlib.pyplot as plt
import matplotlib as mpl
plt.figure(figsize=(20,8),dpi=100)  # 提高清晰度
# 处理汉字乱码
mpl.rcParams['font.sans-serif'] = ['SimHei']
mpl.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, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1]
# 绘制饼图
plt.pie(money_scale, labels=kinds, autopct='%3.1f%%', shadow=True,
        explode=dev_position, startangle=90)
plt.show()

绘制常见类型图表_第24张图片

        绿色扇形的面积最大,说明餐饮美食方面的支出在当月总支出中占比最大;橙色扇形的面积最小,说明人情往来的支出在当月总支出中占比最小。

十五、使用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 numpy as np
import matplotlib.pyplot as plt
data = np.random.randn(100)
# 绘制箱形图:显示中位数的线条、箱体宽度为0.3、填充箱体颜色、不显示异常值
plt.boxplot(data, meanline=True, widths=0.3, patch_artist=True,  
            showfliers=False)
plt.show()

绘制常见类型图表_第25张图片

实例:2017年和2018年全国发电量统计

本实例要求根据下表的数据,将发电量(亿千瓦时)列的数据作为x轴的数据,将2017年和2018年作为y轴的刻度标签,使用boxplot()函数绘制下图所示的箱形图

# 08_generation_capacity
import numpy as np
import matplotlib.pyplot as plt
plt.rcParams['font.family'] = 'SimHei'
plt.rcParams['axes.unicode_minus'] = False
data_2018 = np.array([5200, 5254.5, 5283.4, 5107.8, 5443.3, 5550.6, 
                      6400.2, 6404.9, 5483.1, 5330.2, 5543, 6199.9])
data_2017 = np.array([4605.2, 4710.3, 5168.9, 4767.2, 4947, 5203, 
                      6047.4, 5945.5, 5219.6, 5038.1, 5196.3, 5698.6])
# 绘制箱形图
plt.boxplot([data_2018, data_2017], labels=('2018年', '2017年'),
            meanline=True, widths=0.5, vert=False, patch_artist=True)
plt.show()

绘制常见类型图表_第26张图片 

十六、使用polar()绘制雷达图

polar(theta, r, **kwargs)

  • theta:表示每个数据点所在射线与极径的夹角。
  • r:表示每个数据点到原点的距离。

 

实例:霍兰德职业兴趣测试

  • 霍兰德职业兴趣测试是由美国职业指导专家霍兰德根据他本人大量的职业咨询经验及其职业类型理论编制的测评工具。
  • 本实例要求根据下表的数据,将标题一行的数据作为雷达图的标签,将其余行的数据作为雷达图的数据,使用polar()函数绘制下图所示的雷达图。
# 09_holland_professional_interest_test
import numpy as np
import matplotlib.pyplot as plt
plt.rcParams['font.family'] = 'SimHei'
plt.rcParams['axes.unicode_minus'] = False
dim_num = 6
data = np.array([[0.40, 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.45, 0.32, 0.28],
                 [0.34, 0.31, 0.38, 0.40, 0.92, 0.28]])
angles = np.linspace(0, 2 * np.pi, dim_num, endpoint=False)
angles = np.concatenate((angles, [angles[0]]))
data = np.concatenate((data, [data[0]]))
# 维度标签
radar_labels = ['研究型(I)', '艺术型(A)', '社会型(S)', 
                '企业型(E)', '传统型(C)', '现实型(R)']
radar_labels = np.concatenate((radar_labels, [radar_labels[0]]))
# 绘制雷达图
plt.polar(angles, data)
# 设置极坐标的标签
plt.thetagrids(angles * 180/np.pi, labels=radar_labels)
# 填充多边形
plt.fill(angles, data, alpha=0.25)
plt.show()

绘制常见类型图表_第27张图片

 十七、使用errorbar()绘制误差棒图

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

  • x,y:表示数据点的位置。
  • xerr,yerr:表示数据的误差范围。
  • fmt:表示数据点的标记样式和数据点之间连接线的样式。
  • elinewidth:表示误差棒的线条宽度。
  • capsize:表示误差棒边界横杆的大小。
  • capthick:表示误差棒边界横杆的厚度。
import numpy as np
import matplotlib.pyplot as plt
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()

绘制常见类型图表_第28张图片

实例:

        细根生物量的多少反映了根系从土壤中吸收水分和养分的能力,是植物地下部分集汇能力的重要体现。不同树种细根生物量存在差异性,各树种细根生物量在不同季节间差异较为明显。

        本实例要求根据下表的数据,将季节列的数据作为x轴的刻度标签,将其他列的数据作为y轴的数据,使用errorbar()函数绘制下图所示的误差棒图。

# 10_fine_root_biomass
import numpy as np
import matplotlib.pyplot as plt
plt.rcParams['font.family'] = 'SimHei'
plt.rcParams['axes.unicode_minus'] = False
# 准备 x 轴和 y 轴的数据
x = np.arange(3)
y1 = np.array([2.04, 1.57, 1.63])
y2 = np.array([1.69, 1.61, 1.64])
y3 = np.array([4.65, 4.99, 4.94])
y4 = np.array([3.39, 2.33, 4.10])
# 指定测量偏差
error1 = [0.16, 0.08, 0.10]
error2 = [0.27, 0.14, 0.14]
error3 = [0.34, 0.32, 0.29]
error4 = [0.23, 0.23, 0.39]
bar_width = 0.2
# 绘制柱形图
plt.bar(x, y1, bar_width)
plt.bar(x + bar_width, y2, bar_width, align="center", 
        tick_label=["春季", "夏季", "秋季"])
plt.bar(x + 2*bar_width, y3, bar_width)
plt.bar(x + 3*bar_width, y4, bar_width)
# 绘制误差棒 : 横杆大小为 3,  线条宽度为 3,  线条颜色为黑色, 数据点标记为像素点
plt.errorbar(x, y1, yerr=error1, capsize=3, elinewidth=2, fmt=' k,')
plt.errorbar(x + bar_width, y2, yerr=error2, capsize=3, elinewidth=2, fmt='k,')
plt.errorbar(x + 2*bar_width, y3, yerr=error3, capsize=3, elinewidth=2, fmt='k,')
plt.errorbar(x + 3*bar_width, y4, yerr=error4, capsize=3, elinewidth=2, fmt='k,')
# plt.legend(lines, ["A公司", "B公司","C公司"], shadow=True, fancybox=True) # 添加图例
plt.show()



# lines = plt.stackplot(x, y_a, y_b, y_c)
# plt.legend(lines, ["A公司", "B公司","C公司"], shadow=True, fancybox=True) # 添加图例

绘制常见类型图表_第29张图片

 十八、绘制甘特图

  • 甘特图亦称为横道图、条状图,它通过活动列表和时间刻度表示特定项目的顺序与持续时间。甘特图一般以时间为横轴,项目为纵轴,可以直观地展示每个项目的进展情况,便于管理者了解项目的剩余任务及评估工作进度
  • 甘特图类似于条形图,这两种图表的图形都是横向矩形条,但甘特图中每个矩形条的起始位置是不同的
  • 使用pyplot的barh()函数可以绘制一个甘特图,只需要给该函数的left参数传值,指定每个矩形条的x坐标即可。

        已知某公司预计开辟一个新项目,为确保项目的可行性,将该项目分解成“项目确定”“问卷设计”“试访”“问卷确定”“实地执行”“数据录入”“数据分析”和“报告提交” 8个子任务,并指定了各子任务的周期。
        已知每个子任务的开发周期依次为:0.5, 1.5, 1, 3, 0.5, 1, 1,2,下面根据这些数据,使用barh()函数绘制一个甘特图,通过该图表展示整个项目的开发周期。

import numpy as np
import matplotlib.pyplot as plt
ticks = np.array(['报告提交', '数据分析', '数据录入', '实地执行', 
                  '问卷确定', '试访', '问卷设计', '项目确定'])
y_data = np.arange(1, 9)
x_data = np.array(([2,1,1,0.5,3,1,1.5,0.5]))
#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()

绘制常见类型图表_第30张图片

 十九、绘制等高线图

  • 等高线图是地形图上高程相等的相邻各点所连成的闭合曲线,它会将地面上海拔高度相同的点连成环线,之后将环线垂直投影到某一水平面上,并按照一定的比例缩绘到图纸上,常见于山谷、山峰或梯度下降算法的场景
  • 等高线图包含三个主要的信息,分别为坐标点的x值、坐标点y值以及坐标点的高度。假设坐标点的高度为h,则h、x、y之间的关系如下所示:
  • 在matplotlib中,使用pyplot模块的contour()、contourf()函数可以绘制和填充等高线图。contour()函数的语法格式如下所示:

contour([X, Y,]Z, [levels,]**kwargs)

  • X,Y:表示坐标点的网格数据。

  • Z:表示坐标点对应的高度数据。

  • levels:表示等高线的数量。若levels为n,则说明绘制n+1条等高线。

  • colors:表示不同高度的等高线颜色。

  • cmap:表示颜色映射表。

  • linewidths:表示等高线的宽度。

  • linestyles:表示等高线的线型。

    需要注意的是,参数X、Y需要接收网格数据,即以坐标矩阵批量地描述点的位置。numpy模块的meshgrid()函数可以生成网格数据。除此之外,contourf()与contour()函数的参数相似,此处不再赘述

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()

 绘制常见类型图表_第31张图片

 二十、使用mplot3d绘制3D图表

mplot3d概述

  • matplotlib不仅专注于二维图表的绘制,也具有绘制3D图表、统计地图的功能,并将这些功能分别封装到工具包mpl_toolkits.mplot3d、mpl_toolkits.basemap中,另外可以结合animation模块给图表添加动画效果
  • mplot3d是matplotlib中专门绘制3D图表的工具包,它主要包含一个继承自Axes的子类
  • Axes3D()方法
    Axes3D()是构造方法,它直接用于构建一个Axes3D类的对象使用Axes3D类可以构建一个三维坐标系的绘图区域。

Axes3D(fig, rect=None, *args, azim=-60, elev=30, zscale=None,sharez=None, proj_type=‘persp’, **kwargs)

  • fig:表示绘图区域所属的画布。
  • rect:表示确定三维坐标系位置的元组。
  • add_subplot()方法
    在调用add_subplot()方法添加绘图区域时为该方法传入projection=‘3d’,即指定坐标系的类型为三维坐标系,并返回一个Axes3D类的对象。
  • 官方推荐使用add_subplot()方法创建Axes3D类的对象。
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
fig = plt.figure()
ax = Axes3D(fig)

绘制常见类型图表_第32张图片

import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')

绘制3D线框图

Axes3D类的对象使用plot_wireframe()方法绘制线框图

plot_wireframe(self, X, Y, Z, *args, **kwargs)

  • X,Y,Z:表示x、y、z轴的数据。
  • rcount,ccount:表示每个轴方向上使用的最大样本量,默认为50。若输入的样本量更大,则会采用降采样的方式减少样本的数量;若输入的样本量为0,则不会对相应轴方向的数据进行采样。
  • rstride,cstride:表示采样的密度。若仅使用参数rstride或cstride中任意一个,则另一个参数默认为0。
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import axes3d
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
# 获取测试数据
X, Y, Z = axes3d.get_test_data(0.05)
# 绘制 3D线框图
ax.plot_wireframe(X, Y, Z, rstride=10, cstride=10)# 采样密度
plt.show()

绘制常见类型图表_第33张图片

绘制3D曲面图

Axes3D类的对象使用plot_surface()方法绘制3D曲面图

plot_surface(self, X, Y, Z, *args, norm=None, vmin=None, vmax=None,lightsource=None, **kwargs)

  • X,Y,Z:表示x、y、z轴的数据。
  • rcount,ccount:表示每个坐标轴方向上使用的最大样本量,默认为50。
  • rstride,cstride:表示采样的密度。
  • color:表示曲面的颜色。
  • cmap:表示曲面的颜色映射表。
  • shade:表示是否对曲面进行着色。
from mpl_toolkits.mplot3d import Axes3D
import matplotlib.pyplot as plt
from matplotlib import cm
import numpy as np
x1 = np.arange(-5, 5, 0.25)
y1 = np.arange(-5, 5, 0.25)
x1, y1 = np.meshgrid(x1, y1)
r1 = np.sqrt(x1** 2 + y1 ** 2)
z1 = np.sin(r1)
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
# 绘制曲面图
ax.plot_surface(x1, y1, z1, cmap=cm.coolwarm, linewidth=0, antialiased=False) 
# 设置 z 轴刻度的范围、位置、格式
ax.set_zlim(-1.01, 1.01)
plt.show()

绘制常见类型图表_第34张图片

实例:三维空间的星星

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

# 01_stars_in_3d
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()

绘制常见类型图表_第35张图片

# 引入matplotlib包
from mpl_toolkits.mplot3d import Axes3D
import matplotlib.pyplot as plt
from matplotlib import cm
import numpy as np
# 创建Figure实例
fig = plt.figure()
# 添加子图
fig1 = fig.add_subplot(221,projection='3d')
fig2 = fig.add_subplot(2, 2, 2)
fig4 = fig.add_subplot(224, projection='3d')
fig.add_subplot(2, 2, 3)

# 在子图上作图
random_arr = np.random.randn(100)
# 默认是在最后一次使用subplot的位置上作图,即编号为3的位置
plt.plot(random_arr)

# 在fig1---作图3D
x1 = np.arange(-5, 5, 0.25)
y1 = np.arange(-5, 5, 0.25)
x1, y1 = np.meshgrid(x1, y1)
r1 = np.sqrt(x1** 2 + y1 ** 2)
z1 = np.sin(r1)
#ax = fig1(projection='3d')
# 绘制曲面图
fig1.plot_surface(x1, y1, z1, cmap=cm.coolwarm, linewidth=0, antialiased=False) 
# 设置 z 轴刻度的范围、位置、格式
fig1.set_zlim(-1.01, 1.01)

# 在fig2---作图圆环
data = np.array([20, 50, 10, 15, 30, 55])
pie_labels = np.array(['A', 'B', 'C', 'D', 'E', 'F'])
# 绘制圆环图:外圆半径为1.5,楔形宽度为0.7
fig2.pie(data, radius=1.5, wedgeprops={'width': 0.7}, labels=pie_labels,
        autopct='%3.1f%%', pctdistance=0.75)
# 在fig4---绘制3D线框图
#----------------------------------
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import axes3d
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
# 获取测试数据
X, Y, Z = axes3d.get_test_data(0.05)
# 绘制 3D线框图
ax.plot_wireframe(X, Y, Z, rstride=10, cstride=10)
plt.show()
#--------------------------------------------------
#ax = fig.add_subplot(111, projection='3d')
# 获取测试数据
X, Y, Z = axes3d.get_test_data(0.05)
# 绘制 3D线框图
fig4.plot_wireframe(X, Y, Z, rstride=10, cstride=10)
plt.show()

14.1 basemap概述
在数据可视化中,人们有时需将采集的数据按照其地理位置显示到地图上,常见于城市人口、飞机航线、矿藏分布等场景,有助于用户理解与空间有关的信息。basemap是matplotlib中的地图工具包,它本身不会参与任何绘图操作,而是会将给定的地理坐标转换到地图投影上,之后将数据交给matplotlib进行绘图。

  • 安装basemap
    在Anaconda中安装basemap的方式比较简单,可以直接在Anaconda Prompt工具中输入如下命令 :

conda install

执行以上命令后,conda命令会自动解析当前的Python环境并下载当前环境对应的basemap包。需要说明的是,在命令执行的过程中会询问用户是否安装,用户只需同意即可。

绘制常见类型图表_第36张图片 绘制常见类型图表_第37张图片

 

 

你可能感兴趣的:(数据可视化,机器学习,python,开发语言,机器学习,数据分析)