文章目录
matplotlib折线图
-
折线图:可以很直观的反应出数据的变化趋势,反应事物的变化情况
-
应用场景:适合二维的大数据集,还适合多个二维数据集的比较
-
模拟股票10分钟的变化趋势
- 画出股票趋势图
import numpy as np import pandas as pd import matplotlib.pyplot as plt #1)准备数据 x = range(1,11) #股票10分钟 y = np.random.normal(size=10) #正态分布随机生成10个数据 #2)创建画布 fig = plt.figure(figsize=(16,6),dpi=100) #设置大小,设置dpi #3)绘制折线图 plt.plot(x,y) #4)显示图像 plt.show() #show方法会释放figure资源
-
设置刻度标签,设置刻度值
plt.xticks(x,**kwargs):x:显示的刻度值
plt.yticks(y,**kwargs):y:显示的刻度值
#构造刻度标签 x_ticks_label = ['10点{}分'.format(i) for i in x] plt.xticks(x,x_ticks_label,rotation=45) #rotation:将刻度标签旋转多少度
-
设置轴标签,标题
#设置x,y轴标签 plt.xlabel('时间') plt.ylabel('涨幅') #设置图像标题 plt.title('股票10分中的涨幅')
-
设置颜色,标记和线类型
#设置颜色color #设置线类型linestyle #设置标记marker plt.plot(x,y,color='r',linestyle='--',marker='o')
-
显示图例
可能我们在一个绘图区,需要绘制多个图形,多次plot就可以解决
#在添加一条数据 y_B = np.random.normal(size=10) #进行绘制 #plt.plot(x,y_B,color='b',marker='o') #添加图例 #显示图例我们需要先加上label标签 plt.plot(x,y,color='r',linestyle='--',marker='o',label='A') plt.plot(x,y_B,color='b',marker='o',label='B') plt.legend(loc='best') #添加网格显示 plt.grid(True,linestyle='--',alpha=1) #appha:透明度
matplotlib饼图
-
饼图:用于表示不同分类的占比情况,通过弧度大小来对比各种分类。饼图通过将一个圆饼按照分类的占比划分成多个区块,整个圆饼代表数据的总量,每个区块(圆弧)表示该分类占总体的比例大小,所有区块(圆弧)的加和等于 100%。
应用场景:分类占比
-
每个省份投资额占比
#由于分类过多,截取前5组数据进行绘图 # y 为dataframe列名,或者列名列表,当绘制多列数据,指定subplots=True,绘制在不同的子图中 # autopct:在图中显示百分比 #shadow:布尔值,为饼图增加阴影效果 # explode:为饼图增加破裂效果,值越大,破裂越大 #startangle:饼图旋转角度,从X轴逆时针旋转 data[0:5].plot(kind='pie',y='投资额',figsize=(16,9),autopct="%1.2f%%",shadow=True,explode=(0,0,0.3,0,0),startangle=90) #让饼图保持正圆形 plt.axis('equal') plt.show()
matplotlib散点图
-
散点图:用两组数据构成多个坐标点,考察坐标点的分布,判断两变量之间是否存在某种关联或总结坐标点的分布模式。散点图将序列显示为一组点。值由点在图表中的位置表示。
应用场景:判断两个变量之间是否存在关联,判断异常值
-
探究 投资额和住宅投资的关系
import pandas as pd import numpy as np import matplotlib.pyplot as plt data = pd.read_csv('d:/test_data/房地产投资金额.csv',engine='python',index_col=0) data.plot(kind='scatter',x='投资额',y='住宅',figsize=(16,9),color='r') #dataframe绘制散点图,需要指定x,y为 dataframe中的列,同样可以给图像添加样式,如指定color,alpha,marker plt.show() #从图中我们可以看出,投资额和住宅成正比关系
matplotlib箱线图
-
箱线图:是一种直观简洁的方式去呈现一组数据的分布. 因其形状如箱子而得名. 箱线图广泛用于各个数据分析领域. 它能非常简单明了地显示一组数据中5个重要数值, 最大值 (Maximum Value), 最小值 (Minimum Value), 中位数 (Median Value), 下四分位数 (First Quartile), 上四分位数 (Third Quartile). 箱线图还能发现一组数据中的存在的异常值 (Outliers).
分位数:把所有数值由小到大排列并分成四等份,处于三个分割点位置的数值就是四分位数。
-
查看投资数据的异常值
# data.plot(kind='box',figsize=(16,9)) plt.show() #高于上边缘的值,为异常值,我们可以用于查看异常值
matplotlib柱状图
-
柱状图:一种以长方形的长度为变量的表达图形的统计报告图,由一系列高度不等的纵向条纹表示数据分布的情况,用来比较两个或以上的价值(不同时间或者不同条件),只有一个变量,通常利用于较小的数据集分析
- 柱状图:柱形图、堆积柱形图、百分比堆积柱形图等。
- 适用场景
- 适合分析分类数据字段、或者连续的数据字段,利用柱子的高度来反映数据的数值差异。、
- 适合分析对比组内各项数据
- 堆积柱:可以形象的展示一个大分类包含的每个小分类的数据,以及小分类的占比情况,显示的是单个项目与整体之间的关系
- 百分比堆积柱形图:矩形高度表示每子项占当前项的百分比
-
案例
import numpy as np import pandas as pd import matplotlib.pyplot as plt data = pd.read_csv('d:/test_data/房地产投资金额.csv',index_col='地区',engine='python') data1 = data[0:5] data1.plot.bar(figsize=(16,9)) #data1.plot(kind=bar,figsize=(16,9)) plt.show() #在柱状图中,每一行的值进行分组,我们可以看出北京是一组,天津是一组,河北是一组
条形图:维度分类较多或维度名称比较长的时候使用横向树状图(条形图)
data.plot(kind='barh',figsize(16,9)) plt.show()
堆积图:更直观对比整体的数据,可以更清晰的看出各种类别的占比情况
data.plot(kind='barh',stacked=True,figsize=(16,9)) #传递参数stacked=True来生成堆积树状图 plt.show()
百分比堆积树状图:展示的占比的情况
data.div(data.sum(1),axis=0).plot(kind='barh',figsize=(16,9),stacked=True)
plt.show()
matplotlib直方图,密度图
-
直方图:又称质量分布图,是一种统计报告图,由一系列高度不等的纵向条纹或线段表示数据分布的情况。 一般用横轴表示数据类型,纵轴表示分布情况。用来整理计量值的观测数据,分析其分布状态的统计方法,用于对总体的分布特征进行推断
应用场景:表示分布状态,分析数据是否服从正态分布,判断数据是否异常或者孤立
-
直方图与柱状图的比较:
-
直方图展示数据的分布,柱状图比较数据的大小。这是直方图与柱状图最根本的区别。直方图表示在一定值的区间中,有多少数据,表现的是数据的分布情况。柱状图表示,每一个数据的值的大小,表现的是值大小的对比
-
直方图X轴为定量数据,柱状图X轴为分类数据。 直方图的x轴通常是连续排列的,柱状图是分开排列的
-
柱状图是以矩形的长度表示每一组的数据大小,其宽度(表示类别)则是固定的,利于较小的数据集分析。
-
直方图是以矩形的长度表示每一组的频数或频率,宽度则表示各组的组距,因此其高度与宽度均有意义,利于展示大量数据集的统计结果。
-
-
画直方图一般流程
- 计算极差(最大值 - 最小值)
- 设置组距
- 计算组数(极差/ 组距)(通常对于数据较少的情况,分为5 ~ 12组 )
-
案例
#绘制分布直方图 #在这里我们直接分组设置成了25组 data.plot(kind='hist',bins=25,figsize=(16,9),subplots=True) #subplots:将Dataframe的每一列绘制在子图中 #data.plot(kind='hist',bins=25,figsize=(16,9),subplots=True,density=True) # density绘制直方频率图,面积总和为1 plt.show()
-
密度图:用于显示数据在连续区间内的分布状况。这种图表是直方图的变种,使用平滑曲线来绘制数值水平,从而得出更平滑的分布。密度图的峰值显示数值在该时间段内最为高度集中的位置。
-
密度图其中一个比直方图优胜的地方,是由于它们不受所使用分组数量(典型直方图中所使用的条形)的影响,所以能更好地界定分布形状 。
#绘制密度曲线图 data.plot(kind='kde',figsize=(16,9))
-
面向对象绘图
-
我们在程序中尽量采用面向对象进行绘图,有利于我们可以绘制多个子图,这里为了大家更方便的理解,给出一般的画图流程
figure ()函数会产生一个指定编号为num的图:
figure(num=None, figsize=None, dpi=None, facecolor=None, edgecolor=None, frameon=True)
num:图像编号或名称,数字为编号 ,字符串为名称
figsize:指定figure的宽和高,单位为英寸;
dpi参数指定绘图对象的分辨率,即每英寸多少个像素,缺省值为80,1英寸等于2.5cm,A4纸是 21*30cm的纸张
facecolor:背景颜色
edgecolor:边框颜色
frameon:是否显示边框
这里, figure(1)其实是可以省略的,因为默认情况下plt会自动产生一幅图像。
使用subplot可以在一副图中生成多个子图 ,其参数为:
plt.subplots(nrows,ncols,sharex,sharey,subplot_kw,**fig_kw)
subplot可以规划figure划分为n个子图,但每条subplot命令只会创建一个子图
nrows : subplot的行数
ncols : subplot的列数
sharex : 所有subplot应该使用相同的X轴刻度(调节xlim将会影响所有subplot
sharey : 所有subplot应该使用相同的Y轴刻度(调节ylim将会影响所有subplot
subplot_kw : 用于创建各subplot的关键字字典
**fig_kw : 创建figure时的其他关键字,如plt.subplots(2, 2, figsize=(8, 6))
plt. subplot (numrows, numcols,fignum)形式
其中numrows, numcols是行列数, fignum是第几个图,比如(221)则是一个有四个图,该图位于第一个
当numrows * numcols < 10 时,中间的逗号可以省略,因此plt. subplot (211)就相当于plt. subplot(2, 1, 1)。
1.fig, ax = plt.subplots(figsize = (a, b))解析
在matplotlib一般使用plt.figure来设置窗口尺寸。
plt.figure(figsize=(a, b))
fig代表绘图窗口(Figure);ax代表这个绘图窗口上的坐标系(axis),一般会继续对ax进行操作。
但是如果使用plt.subplots,就不一样了。
fig, ax = plt.subplots(figsize = (a, b))
fig代表绘图窗口(Figure);ax代表这个绘图窗口上的坐标系(axis),一般会继续对ax进行操作。
fig, ax = plt.subplots()等价于:
fig = plt.figure()
ax = fig.add_subplot(1, 1, 1)
实例1:
fig, ax = plt.subplots(1, 3, 1)
第一个1参数是子图的行数,第二个3参数是子图的列数
第三个1参数是代表第一个子图,如果想要设置子图的宽度和高度可以在函数内加入figsize值。
实例2:
import numpy as np
import matplotlib.pyplot as plt
# 做1*1个子图,等价于"fig, ax = plt.subplot()",等价于"fig, ax = plt.subplots()"
fig, ax = plt.subplots(1, 1)
ax2 = ax.twinx() # 让2个子图的x轴一样,同时创建副坐标轴。
# 作y=sin(x)函数
x1 = np.linspace(0, 2 * np.pi, 100) # 表示在区间[0, 2π]之间取100个点作为横坐标
y1 = np.sin(x1)
ax.plot(x1, y1)
# 作y=cos(x)函数
x2 = np.linspace(0, 2 * np.pi, 100)
y2 = np.cos(x2)
ax2.plot(x2, y2)
plt.show()
2.plt.subplot()函数解析
plt.subplot()函数用于直接指定划分方式和位置进行绘图。
pylab和pyplot有当前的图形(figure)和当前的轴(axes)的概念,所有的作图命令都是对当前的对象作用。可以通过gca()获得当前的轴(axes),通过gcf()获得当前的图形(figure)。
# 使用plt.subplot来创建小图. plt.subplot(221)表示将整个图像窗口分为2行2列, 当前位置为1.
plt.subplot(221)
# plt.subplot(222)表示将整个图像窗口分为2行2列, 当前位置为2.
plt.subplot(222) # 第一行的右图
# plt.subplot(223)表示将整个图像窗口分为2行2列, 当前位置为3.
plt.subplot(223)
# plt.subplot(224)表示将整个图像窗口分为2行2列, 当前位置为4.
plt.subplot(224)
注意:其中各个参数也可以用逗号,分隔开。第一个参数代表子图的行数;第二个参数代表该行图像的列数; 第三个参数代表每行的第几个图像。
'''如果不指定figure()的轴,figure(1)命令默认会被建立,
同样的如果你不指定subplot(numrows,numcols,fignum)的轴,subplot(111)也会自动建立。'''
import matplotlib.pyplot as plt
plt.figure(1) # 创建第一个画板(figure)
plt.subplot(211) # 第一个画板的第一个子图
plt.plot([1, 2, 3])
plt.subplot(212) # 第一个画板的第二个子图
plt.plot([4, 5, 6])
plt.figure(2) # 创建第二个画板
plt.plot([4, 5, 6]) # 默认子图命令是subplot(111)
plt.figure(1) # 调取画板1; subplot(212)仍然被调用中
plt.subplot(211) # 调用subplot(211)
plt.title('Easy as 1, 2, 3') # 做出211的标题
#创建一个包含4个子图对象的figure,默认生成1个
plt.subplots(2,2,figsize=(16,6),dpi=100)
#返回一个元组,里面包含了figure对象,以及4个子图对象
(<Figure size 1600x600 with 4 Axes>,
array([[<matplotlib.axes._subplots.AxesSubplot object at 0x000001303D43A2B0>,
<matplotlib.axes._subplots.AxesSubplot object at 0x000001303D4AABA8>],
[<matplotlib.axes._subplots.AxesSubplot object at 0x000001303D4DA240>,
<matplotlib.axes._subplots.AxesSubplot object at 0x000001303D5008D0>]],
dtype=object))
#选取子图进行绘制,选取第二行的第二个进行绘制
#准备数据
fig,axs = plt.subplots(2,2,figsize=(16,6),dpi=100,sharex=True,sharey=True)
x=[1,2,3,4,5]
y=[0.6,0.8,-0.3,0.2,-0.1]
#选取我们所需的子图我们使用数组索引
axs[1,1].plot(x,y)
从上图我们可以看出,我们子图和子图之间默认会有一定的间距,我们可以使用subplots_adjust对间距进行调整
subplts_adjust(wspace, hspace)
wspace:宽度百分比:
hspace:高度百分比
#调整子图的间距
plt.subplots_adjust(wspace=0,hspace=0) #消除了子图与子图之间的间距
-
模拟股票10分钟变化趋势,使用面向对象进行绘图
使用面向对象绘图有一些基本方法改变:
set_xticks:设置 x轴的刻度
set_yticks:设置 y轴的刻度
set_xticklabes:设置 x轴的刻度标签
set_yticklabes:设置 y轴的刻度标签
set_xlabel:设置 x轴标签
set_ylabe:设置 y轴标签
set_title:设置标题
#创建画布,默认生成一个 fig,ax = plt.subplots(figsize=(16,6),dpi=100) #面向对象进行画图 ax.plot(x,y,color='r',linestyle='--',marker='o',label='A') ax.plot(x,y_B,color='b',marker='D',label='B') #显示图例,默认是best ax.legend() #添加网格 ax.grid(linestyle='--',alpha=1) #添加标题 ax.set_title('股票10分中的涨幅') #设置轴的标签 ax.set_xlabel('时间') ax.set_ylabel('涨幅') #设置刻度值 ax.set_xticks(x) #设置刻度值标签 ax.set_xticklabels(x_ticks_label) #释放figure资源,输出图像 plt.show()
-
绘制子图
#创建一个2*1的画布
fig,axs = plt.subplots(2,1,figsize=(16,6),dpi=100,sharex=True)
#多个子图进行绘图的时候,我们需要选择我们绘图区(axes)
#选择第一个axes
axs[0].plot(x,y,color='r',linestyle='--',marker='o',label='A')
#选择第二个axes
axs[1].plot(x,y_B,color='b',marker='D',label='B')
axs[0].legend()
axs[1].legend()
axs[0].grid(linestyle='--',alpha=1)
axs[1].grid(linestyle='--',alpha=1)
axs[0].set_title('A股票10分中的涨幅')
axs[1].set_title('B股票10分中的涨幅')
axs[0].set_xlabel('时间')
axs[1].set_xlabel('时间')
axs[0].set_ylabel('涨幅')
axs[1].set_ylabel('涨幅')
#在创建画布的时候,设置了sharex=True,所有的子图共享x轴刻度
axs[0].set_xticks(x)
axs[0].set_xticklabels(x_ticks_label)
plt.show()