图表绘制工具:Matplotlib
概念
- 一个python版的matlab绘图接口
- 以2D为主
- 支持python、numpy、pandas基本数据结构
- 有较丰富的图表库
图表窗口
- plt.show() : 直接生成图表
- % matplotlib inline : 魔法函数(常用)==》魔法函数,不需要 plt.show()
- % matplotlib notebook : 弹出可交互的matplotlib窗口
- % matplotlib qt5 : 弹出matplotlib控制台
图表基本元素
- figsize:创建图表窗口,设置窗口大小
- plt.title('test'):设置图名
- plt.xlabel('Plot Number'):x轴标签
- plt.ylabel('Important var'):y轴标签
- plt.legend(loc = 'best'):显示图例,loc表示位置;loc : 数字从0到10 loc = 0-10
- plt.xlim([0,12]):x轴边界
- plt.ylim([0,1.5]):y轴边界
- plt.xticks(range(10)):设置x刻度
- plt.yticks([0,0.2,0.4,0.6,0.8,1.0,1.2]):设置y刻度
- fig.set_xticklabels('%.1f' %i for i in range(10)):x轴刻度标签
- fig.set_yticklabels('%.2f' %i for i in [0,0.2,0.4,0.6,0.8,1.0,1.2]):y轴刻度标签
-
网格设置 :网格设置 : plt.grid(True,color='gray',linewidth='0.5',axis='both')
- True : 显示网格
- linestyle : 线型
- color : 颜色
- linewidth : 宽度
- axis:x,y,both : 显示x/y/两者的格网
-
显示刻度 : plt.tick_params(bottom='on',top='off',left='on',right='off')
-
刻度的方向 : in/out/inout
- matplotlib.rcParams['xtick.direction'] = 'in'
- matplotlib.rcParams['ytick.direction'] = 'inout'
-
坐标轴可见性
- plt.axis('off') : 关闭坐标轴
- frame.axes.get_xaxis().set_visible(False) : x轴不可见(True/False)
- frame.axes.get_yaxis().set_visible(False) : y轴不可见(True/False)
图表样式参数
-
linestyle参数
- 表示整体线型的样式
- '-' solid line style
- '--' dashed line style
- '-.' dash-dot line style
- ':' dotted line style
-
marker参数
-
color参数
-
color
- red-r
- green-g
- black-k
- blue-b
- yellow-y
-
colormap : 色板
- 各类颜色首字母大写,尾部加s
- 春夏秋冬海洋,字母小写
- 各类色板后加 _r,表示颜色反转
-
style参数
- 可以包含linestyle,marker,color
- 三者样式写于一个字符串内
-
整体风格样式
- 导入模块 ; import matplotlib.style as psl
- 查看样式列表 : print(plt.style.available)
- 一旦选用样式后,所有图表都会有样式,重启后方可关掉
刻度、注解和图表输出
-
刻度
-
导入模块:from matplotlib.ticker import MultipleLocator, FormatStrFormatter
- ax = plt.subplot(111) #注意:一般都在ax中设置,不在plot中设置
-
刻度参数设置
- 将x主刻度标签设置为10的倍数 : xmajorLocator = MultipleLocator(10)
- 设置x轴标签文本的格式 : xmajorFormatter = FormatStrFormatter('%.0f')
- 将x轴次刻度标签设置为5的倍数 : xminorLocator = MultipleLocator(5)
- 将y轴主刻度标签设置为0.5的倍数 : ymajorLocator = MultipleLocator(0.5)
- 设置y轴标签文本的格式 : ymajorFormatter = FormatStrFormatter('%.1f')
- 将此y轴次刻度标签设置为0.1的倍数 : yminorLocator = MultipleLocator(0.1)
-
设置主次刻度
- 设置x轴主刻度 : ax.xaxis.set_major_locator(xmajorLocator)
- 设置x轴标签文本格式 : ax.xaxis.set_major_formatter(xmajorFormatter)
- 设置x轴次刻度 : ax.xaxis.set_minor_locator(xminorLocator)
- 设置y轴主刻度 : ax.yaxis.set_major_locator(ymajorLocator)
- 设置y轴标签文本格式 : ax.yaxis.set_major_formatter(ymajorFormatter)
- 设置y轴次刻度 : ax.yaxis.set_minor_locator(yminorLocator)
-
使用主次刻度
- x坐标轴的网格使用主刻度 : ax.xaxis.grid(True, which='both')
- y坐标轴的网格使用次刻度 : ax.yaxis.grid(True, which='minor')
-
删除坐标轴刻度显示
- ax.xaxis.set_major_formatter(plt.NullFormatter())
- ax.yaxis.set_major_locator(plt.NullLocator())
-
注解
- plt.text(4,1,'hahaha',fontsize=10)
- 注解 → 横坐标,纵坐标,注解字符串
-
图表输出
- plt.savefig('pic.png',dpi=800,bbox_inches = 'tight',facecolor = 'r',edgecolor = 'r')
- dpi表示分辨率,越大越清晰;'tight',表示删除多余空白;facecolor 主体颜色;edgecolor 轮廓颜色
子图
-
概念
- 在matplotlib中,整个图像为一个Figure对象
- 在Figure对象中可以包含一个或者多个Axes对象
- 每个Axes(ax)对象都是一个拥有自己坐标系统的绘图区域
-
创建及调整
- fig1 = plt.figure(num=1,figsize=(8,6)) 绘图对象;num 表示图表序号
-
创建方法一:先建立子图然后填充图表
- 先创建图表figure : fig = plt.figure(figsize=(20,12),facecolor = 'gray')
- 添加子图 : ax1 = fig.add_subplot(2,2,1);(2,2,1)代表创建2*2的矩阵表格,然后选择第一个,顺序是从左到右从上到下
- 绘制图表 : 绘制到最后一个子图 ax1.plot(df)
-
创建方法二:plt.subplots(返回numpy数组)
- 创建多个子图 : fig,axes = plt.subplots(2,3,figsize=(10,8))
- 根据索引确定子图 : ax1 = axes[0,2]
- 填充子图 : ax1.plot(ts)
- 未填充子图保持空白,但有轮廓
-
创建方法三:多系列图,分别绘制
- plt.plot(subplots=True,layout=(2,3))
- layout设置布局矩阵,按顺序填充
- subplots为True表示绘制子图
-
调整
- sharex,sharey:是否共享x,y刻度(True/False)
- plt.subplots_adjust(wspace=0,hspace=0) :wspace,hspace:用于控制宽度和高度的百分比
基本图表绘制
-
图表生成
- Series生成图表
- DataFrame生成图表
-
参数说明:
- Series.plot():series的index为横坐标,value为纵坐标
- kind → line,bar,barh...(折线图,柱状图,柱状图-横...)
- label → 图例标签,Dataframe格式以列名为label
- style → 风格字符串,这里包括了linestyle(-),marker(.),color(g)
- color → 颜色,有color指定时候,以color颜色为准
- alpha → 透明度,0-1
- use_index → 将索引用为刻度标签,默认为True
- rot → 旋转刻度标签,0-360
- grid → 显示网格,一般直接用plt.grid
- xlim,ylim → x,y轴界限
- xticks,yticks → x,y轴刻度值
- figsize → 图像大小
- title → 图名
- legend → 是否显示图例,一般直接用plt.legend()
- ax 选择子图
- subplots → 是否将各个列绘制到不同图表,默认False
-
柱状图
- 单系列(Series);plt.plot(kind='bar/barh')
- 多系列(DataFrame);颜色采用 colormap(色板)
- plt.bar(x,y,facecolor='yellowgreen',edgecolor='white',width = 1,yerr=0.1*y)
- x,y参数:x,y值
- width:宽度比例
- facecolor柱状图里填充的颜色
- edgecolor是边框的颜色
- xerr/yerr :x/y方向error bar
- plt.text() 添加柱状图上的值,用zip函数,for遍历
-
堆叠图
-
外嵌图表
- 柱状图外添加表格 plt.table()
- cellText:表格文本 (不包含标签和索引)
- cellLoc:cell内文本对齐位置(center,left,right)
- rowLabels:行标签(一般为索引)
- colLabels:列标签(一般为标签)
- rowLoc:行标签对齐位置(right,left,center)
- loc:表格位置 → left,right,top,bottom(相对于图的位置)
- plt.xticks([]) : 不显示x轴标注
-
面积图
-
创建方法
- Series.plot.area()
- DataFrame.plot.area()
-
注意事项
- stacked:是否堆叠,默认情况下,区域图被堆叠
- 为了产生堆积面积图,每列必须是正值或全部负值
- 当数据有NaN时候,自动填充0,所以需要清洗掉缺失值
-
填图
- axes.fill(x,y)或者plt.fill(x,y,ax=axes)
- axes.legend() 加载图例
- axes.grid() 加载网格
- axes.fill_between(x,y1,y2) 填充两个函数之间的区域
-
饼图
- plt.pie()绘图
- plt.axis('equal') # 保证长宽相等
- 第一个参数:数据
- explode:指定每部分的偏移量(以列表传入)
- labels:标签(一般为数据索引)
- colors:颜色(以列表传入)
- autopct:饼图上的数据标签显示方式(如 '%.2f %%')
- pctdistance:每个饼切片的中心和通过autopct生成的文本开始之间的比例 0.6
- labeldistance:被画饼标记的直径,默认值:1.1
- shadow:阴影 True
- startangle:开始角度
- radius:半径
- frame:图框 False
- counterclock:指定指针方向,顺时针或者逆时针
-
直方图
- plt.hist()
- x : 数据源
- bins:箱子的宽度(个数)
- normed :标准化 (已换为density)
- histtype 风格,bar,barstacked,step,stepfilled
- orientation 水平还是垂直{‘horizontal’, ‘vertical’}
- align : {‘left’,‘mid’, ‘right’}, optional(对齐方式)
- 密度图;s.plot(kind = 'kde')
- 堆叠直方图;添加参数 stacked
-
散点图
- plt.scatter(x, y)
- s:散点的大小
- cmap:colormap
- c = y ,相匹配的坐标列
- marker : 点的样式
- pd.plottong.scatter_matrix()散点矩阵
- diagonal:({‘hist’, ‘kde’}),必须且只能在{‘hist’, ‘kde’}中选择1个 → 每个指标的频率图
-
极坐标图
-
概念
- 由角度和距离构成
- 调用subplot()创建子图时通过设置projection='polar',便可创建一个极坐标子图
- 然后调用plot()在极坐标子图中绘图
- ax1 = plt.subplot(121,projection='polar')
- ax = fig.add_subplot(111,polar=True)
-
参数
- 参数1为角度(弧度制)
- 参数2为value
- lw → 线宽
- set_theta_direction():坐标轴正方向,默认逆时针1
- set_thetagrids():设置极坐标角度网格线显示及标签 → 网格和标签数量一致
- set_rgrids():设置极径网格线显示,其中参数必须是正数
- set_theta_offset():设置角度偏移,逆时针,弧度制
- set_rlim():设置显示的极径范围
- set_rmax():设置显示的极径最大值
- set_rticks():设置极径网格线的显示范围
-
雷达图
- 极坐标的折线图/填图 - plt.plot() ----未闭合
- 极坐标的折线图/填图 - plt.polar() ----首尾闭合
- 极轴图 - 极坐标的柱状图
-
箱型图
-
基本概念
- 是一种用作显示一组数据分散情况资料的统计图
- 包含一组数据的:最大值、最小值、中位数、上四分位数(Q3)、下四分位数(Q1)、异常值
- 中位数 → 一组数据平均分成两份,中间的数
- 下四分位数Q1 → 是将序列平均分成四份,计算(n+1)/4与(n-1)/4两种,一般使用(n+1)/4
- 上四分位数Q3 → 是将序列平均分成四份,计算(1+n)/4*3=6.75
- 内限 → 最大值区间Q3+1.5IQR,最小值区间Q1-1.5IQR (IQR=Q3-Q1)
- 外限 → 最大值区间Q3+3IQR,最小值区间Q1-3IQR (IQR=Q3-Q1)
- 异常值 :内限之外 - 中度异常,外限之外 - 极度异常
-
绘制
-
plt.plot.box()绘制
- color : 样式填充(着色),传入字典序列
- boxes → 箱线
- whiskers → 分位数与error bar横线之间竖线的颜色
- medians → 中位数线颜色
- caps → error bar横线颜色
- vert:是否垂直,默认True
- position:箱型图占位,传入列表
-
plt.boxplot()绘制
- sym 异常点形状,参考marker
- vert = True 是否垂直
- whis = 1.5, IQR,默认1.5
- patch_artist = True, 上下四分位框内是否填充,True为填充
- meanline = True,showmeans = True, 是否有均值线及其形状
- showbox = True, 是否显示箱线
- showcaps = True, 是否显示边缘线
- showfliers = True, 是否显示异常值
- notch = False, 中间箱体是否缺口
- return_type = 'dict') 返回类型为字典
- boxes, 箱线
- medians, 中位值的横线,
- whiskers, 从box到error bar之间的竖线.
- fliers, 异常值
- caps, error bar横线
- means, 均值的横线,
表格处理
-
表格样式
- 按元素处理样式:df.style.applymap(def);自动调用其中的函数
- 按行/列处理样式:df.style.apply(def,参数设置)
- axis:0为列,1为行,默认为0
- subset:索引
- 样式索引、切片
- df.style.apply(highlight_max, axis = 1, subset = pd.IndexSlice[2:5,['b', 'd']])
- 通过pd.IndexSlice[]调用切片
- 也可:df[2:5].style.apply(highlight_max, subset = ['b', 'd']) → 先索引行再做样式
-
表格显示控制 df.style.format()
- 按照百分数显示 df.head().style.format('{:.2%}')
- 显示小数点数 df.head().style.format("{:.4f}")
- 显示正负数 df.head().style.format("{:+.2f}")
- 分列显示 df.head().style.format({'b':"{:.2%}", 'c':"{:+.3f}", 'd':"{:.3f}"})
-
表格样式调用
- 定位空值 df.style.highlight_null(null_color='red')
- 色彩映射 df.style.background_gradient(cmap='Greens',axis =1,low=0,high=1)
- cmap:颜色
- axis:映射参考,0为行,1以列
- 条形图 df.style.bar(subset=['A', 'B'], color='#d65f4f', width=100);width:最长长度在格子的占比
- 分段式构建样式 df.style.bar(subset=['A', 'B'], color='#d65f5f', width=100).highlight_null(null_color='yellow')
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)