常见的图形
# 导包 from matplotlib import pyplot as plt import numpy as np
线性图
简单线性图
在图表的所有类型中,线性图最为简单。线性图的各个数据点由一条直线来连接. 一对对(x, y)值组成的数据点在图表中的位置取决于两条轴(x和y)的刻度范围
如果要绘制一系列的数据点,需要创建两个Numpy数组. 首先, 创建包含x值的数组, 用作x轴. 再创建包含y值得数组,用作y轴. 完成了两个数组创建,只需要调用plot()函数绘制图像即可
# 生成[0, 2π]之间的等间距的100个点 x = np.linspace(0, 2* np.pi,num=100) y = np.sin(x) plt.plot(x,y) plt.show()
绘制样式较全的线形图
# 设置中文字体,否则中文会出现方框状 plt.rcParams["font.sans-serif"] = ['SimHei'] plt.rcParams['axes.unicode_minus'] = False # 准备 x 和 y x = np.linspace(0, 2* np.pi,num=10) y = np.sin(x) # 调用绘制线性图函数plot() plt.plot(x, y, color='#3589FF', # 线的颜色 linestyle=':', # 线的风格 linewidth=3, # 线的宽度 marker='o', # 标记点的样式 markerfacecolor='r', # 标记点的颜色 markersize=10, # 标记点的大小 alpha=0.7, # 图形的透明度 label="cos(x)" ) plt.show()
绘制多条折线
y1 = np.random.random(6) y2 = np.random.random(6) x = np.arange(6) plt.plot(x, y1, label='沈阳') plt.plot(x, y2, label='大连') plt.legend(loc='best') plt.rcParams['font.sans-serif']=['SimHei'] plt.title('各城市房价(单位:万)', fontsize=20) index_name = ['1月', '2月', '3月', '4月', '5月', '6月'] plt.xticks(x, index_name) plt.show()
x = np.linspace(0, 2 * np.pi, num=20) y = np.sin(x) # 调用绘制线性图函数plot() plt.plot(x, y, color='#3589FF', # 线的颜色 linestyle=':', # 线的风格 linewidth=3, # 线的宽度 marker='o', # 标记点的样式 markerfacecolor='r', # 标记点的颜色 markersize=10, # 标记点的大小 alpha=0.7, # 图形的透明度 label="sin(x)" #设置图例的label ) siny = y.copy() cosy = np.cos(x) plt.plot(x, cosy, color='y', # 线的颜色 linestyle='-', # 线的风格 linewidth=3, # 线的宽度 marker='*', # 标记点的样式 markerfacecolor='b', # 标记点的颜色 markersize=15, # 标记点的大小 alpha=0.9, # 图形的透明度 label="cos(x)" #设置图例的label ) # 设置x,y轴的label plt.xlabel('时间(s)') plt.ylabel('电压(V)') plt.legend() plt.title('电压随时间变化的线性图') # 调用show方法显式 plt.show()
将DataFrame绘制成线性图
from pandas import DataFrame,Series 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 # %matplotlib inline data_frame = DataFrame({ '东软熙康': np.random.randint(10, 100, 5), '东软医疗': np.random.randint(10, 100, 5), '东软睿道': np.random.randint(10, 100, 5), }) plt.plot(data_frame, marker='o') # 显示图例 plt.legend(data_frame, loc=2) # 设置x轴刻度标签 plt.xticks([0, 1, 2, 3, 4], ['first', 'secod', 'third', 'forth', 'fifth']) plt.title('东软子公司1-5月份在职人员数量') plt.xlabel('月份') plt.ylabel('在职人数(百人)') # True 显示网格 # linestyle 设置线显示的类型(一共四种) # color 设置网格的颜色 # linewidth 设置网格的宽度 # plt.grid(True, linestyle = "-.", color = "r", linewidth = "3") plt.grid() # 显示图形 plt.show()
条状图
条状图也是非常常用的一种图表类型. 条形图是统计图资料分析中最常用的图形。主要特点有:
- 能够使人们一眼看出各个各个项目数据的大小
- 易于比较各个不同项目数据之间的差别
垂直条状图
import matplotlib.pyplot as plt import numpy as np plt.rcParams["font.sans-serif"] = ['SimHei'] plt.rcParams['axes.unicode_minus'] = False index = np.arange(5) values1 = np.random.randint(11, 20, 5) values2 = np.random.randint(11, 20, 5) values3 = np.random.randint(11, 20, 5) # bar宽度 bar_width = 0.3 # 每一个bar占0.3宽度 plt.bar(index-bar_width, values1, width=bar_width, alpha=0.7, label='社保项目1', color='b') plt.bar(index, values2, width=bar_width, alpha=0.7, label='社保项目2', color='r') plt.bar(index+bar_width, values3, width=bar_width, alpha=0.7, label='社保项目3', color='g') # 显示图例 plt.legend(loc=1) # 设置X轴、Y轴数值范围 # plt.xlim(-0.5, 5) # plt.ylim(10, 20) plt.axis([-0.6, 5, 10, 20]) # 设置x轴刻度标签 rotation旋转角度 plt.xticks(index, ['社保项目'+str(ix) for ix in range(1, 6)], rotation=30) # 设置标题 plt.title('社保项目营收', fontsize=20) plt.xlabel('项目类型') plt.ylabel('项目合同额(亿元)') # 显示数值标签 for a,b in zip(index, values1): plt.text(a-bar_width, b, '%.0f' % b, ha='center', va='bottom', fontsize=7) for a,b in zip(index, values2): plt.text(a, b, '%.0f' % b, ha='center', va='bottom', fontsize=7) for a,b in zip(index, values3): plt.text(a+bar_width, b, '%.0f' % b, ha='center', va='bottom', fontsize=7) # 显示网格 plt.grid() plt.show()
水平条状图
import numpy as np import matplotlib.pyplot as plt plt.rcParams["font.sans-serif"] = ['SimHei'] plt.rcParams['axes.unicode_minus'] = False # 绘制水平条状图 index = np.arange(5) values1 = np.random.randint(10, 17, 5) values2 = np.random.randint(10, 17, 5) values3 = np.random.randint(10, 17, 5) # 绘制条状图 bar_height = 0.3 plt.barh(index, values1, height=0.3, label='社保项目1', color='r') plt.barh(index+bar_height, values2, height=0.3, label='社保项目2', color='b') plt.barh(index+bar_height*2, values3, height=0.3, label='社保项目2', color='y') # y轴标签 plt.yticks(index + bar_height, list('ABCDE')) # 显示数值标签 for a, b in zip(values1, index): plt.text(a, b, '%.0f' % a, ha='left', va= 'center', fontsize=7) for a, b in zip(values2, index): plt.text(a, b+bar_height, '%.0f' % a, ha='left', va= 'center', fontsize=7) for a, b in zip(values3, index): plt.text(a, b+bar_height*2, '%.0f' % a, ha='left', va= 'center', fontsize=7) # 设置标题 plt.title('社保项目营收', fontsize=20) plt.xlabel('项目类型') plt.ylabel('项目合同额(亿元)') plt.axis([0, 20, -0.4, 5]) plt.legend(loc=4) plt.show()
柱状图
柱状图我们经常会用到,我们来看下如何画出柱状图,并在图上标注出数据对应的数值
import numpy as np from matplotlib import pyplot as plt k = 10 # 生成数据 x 和 y x = np.arange(k) y = np.random.random(k) # 画出 x 和 y 的柱状图 plt.bar(x, y) # 增加数值 for x, y in zip(x, y): # 标注数值 # ha='center' 横向居中对齐 # va='bottom'纵向底部(顶部)对齐 plt.text(x, y , '%.2f' % y, ha='center', va='bottom') plt.show()
饼图
除了条状图, 饼图也可以用来表示数据,用pie()函数制作饼图很简单
import matplotlib.pyplot as plt plt.rcParams["font.sans-serif"] = ['SimHei'] plt.rcParams['axes.unicode_minus'] = False # %matplotlib inline # 设置图像大小 plt.figure(figsize=(9, 9)) # 设置标签 labels = ['Java开发', '项目经理', '测试运维人员', 'Python开发', '架构师'] # 标签对应的值 values = [6000, 1000, 2000, 7000, 500] # 每一个标签饼图的颜色 colors = ['red', '#FEDD62', 'blue', 'gray', 'green'] # 那一块内容需要脱离饼图凸显, 可选值0-1 explode = [0.1, 0.1, 0, 0, 0] """ autopct ='%1.1f%%'表示显示百分比 shadow显示阴影 startangle 正值表示逆时针旋转 """ plt.pie(values, labels=labels, colors=colors, explode=explode, startangle=90, shadow=True, autopct='%1.1f%%' ) # 设置为标准圆形 plt.axis('equal') # 显示图例 plt.legend(loc=2) plt.title('东软软件工程师人员职位占比') plt.show()
散点图
用两组数据构成多个坐标点,考察坐标点的分布,判断两变量之间是否存在某种关联或总结坐标点的分布模式。散点图将序列显示为一组点。值由点在图表中的位置表示。类别由图表中的不同标记表示。散点图通常用于比较跨类别的聚合数据
简单的散点图绘制
绘制正态分布
from matplotlib import pyplot as plt import numpy as np # 散点 横轴和纵轴都是特征 x = np.random.normal(0, 1, 10000) # 均值为0 方差为1 正态分布 y = np.random.normal(0, 1, 10000) plt.scatter(x, y, alpha=0.1) plt.show()
x = np.random.normal(0, 1, 10000) y = np.random.normal(0, 1, 10000) a = -2 + np.random.random(100) * 4 b = -2 + np.random.random(100) * 4 plt.scatter(x, y, color='g', alpha=0.1, label='沈阳') plt.scatter(a, b, color='r', alpha=0.4, label='大连') plt.rcParams["font.sans-serif"] = ['SimHei'] plt.rcParams['axes.unicode_minus'] = False plt.legend() plt.show()
绘制随机点
import matplotlib.pylab as plt import numpy as np # 随机生成500个点 k = 500 x = np.random.rand(k) y = np.random.rand(k) # 生成每个点的大小 size = np.random.rand(k) * 50 # 生成每个点的颜色大小 colour = np.arctan2(x, y) plt.scatter(x, y, s=size, c=colour) # 添加颜色栏 plt.colorbar() plt.show()
直方图
直方图由竖立在 x 轴上的多个相邻的矩形组成,这些矩形把 x 轴拆分为一段段彼此不重叠的线段(线段两个端点所标识的数据范围也叫面元),矩形的面积跟落在其所对应的面元的元素数量成正比。这种可视化方法常被用于样本分布等统计研究。
pyplot 用于绘制直方图的函数为 hist(),它能够接收一系列样本个体和期望的面元数量作为参数,把样本范围分成多个区间(面元),然后计算每个面元所包含的样本个体的数量。
简单直方图
pop = np.random.randint(0, 100, 10000) plt.hist(pop, bins=200) plt.show()
画高斯分布直方图
pop = np.random.normal(0, 1, 1000000) plt.hist(pop, bins=1500) plt.show()