数据分析从0到1----Matplotlib篇(二)

简介: 数据分析从0到1----Matplotlib篇

绘制子图

figure是绘制对象(可理解为一个空白的画布),一个figure对象可以包含多个Axes子图,一个Axes是一个绘图区域,不加设置时,Axes为1,且每次绘图其实都是在figure上的Axes上绘图。

接下来将学习绘制子图的几种方式:

  • add_axes():添加区域
  • subplot():均等地划分画布,只是创建一个包含子图区域的画布,(返回区域对象)
  • subplots():既创建了一个包含子图区域的画布,又创建了一个figure图形对象.(返回图形对象和区域对象)

add_axes

添加区域

Matplotib定义了一个axes类(轴域类),该类的对象被称为axes对象(即轴域对象),它指定了一个有数值范围限制的绘图区域。在一个给定的画布(figure)中可以包含多个axes对象,但是同一个axes对象只能在一个画布中使用。

add_axes(rect)

该方法用来生成一个axes轴域对象,对象的位置由参数rect决定

rect是位置参数,接受一个由4个元素组成的浮点数列表,形如[left, bottom, width, height],它表示添加到画布中的矩形区域的左下角坐标(x, y),以及宽度和高度。

fig = plt.figure(figsize=(4,2),facecolor='gray')
f1 = fig.add_axes([0,0,1,0.5])
f2 = fig.add_axes([0.5,0.5,0.2,0.2])
f1.plot([[1,2,3,4,5],[2,3,4,5,6]]) # 指定在f1上绘制
f2.plot([[1,2,3,4,5],[2,3,4,5,6]]) # 指定在f2上绘制

fig = plt.figure(figsize=(4,2),facecolor='gray')
f1 = fig.add_axes([0,0,1,0.5])
f2 = fig.add_axes([0.5,0.5,0.2,0.2]) 
plt.plot([[1,2,3],[2,3,4]]) # 由于f2后赋值
plt.plot([[3,2,1],[-4,-3,-2]]) # 因此全都在f2中绘制

fig = plt.figure() # 获取图形对象
ax = plt.gca() # 获取画布
ax.plot() # 可以在gca返回的画布上进行作画
fig.plot() # 不可以在图像对象想进行plot操作

subplot

该函数用于均匀的划分画布

参数格式如下:

ax = plt.subplot(nrows,ncols,index,*args,**kwargs)

  • nrows行
  • ncols 列 index:索引
  • kwargs: title/xlabel/ylabel等.……
    也可以直接将几个值写到一起,如:subplot(233)
    返回:区域对象
    nrows与ncols表示要划分几行几列的子区域(nrows*nclos表示子图数量),index的初始值为1,用来选定具体的某个子区域。例如: subplot(233)表示在当前画布的右上角创建一个两行三列的绘图区域(如下图所示),同时,选择在第3个位置绘制子图。
# 默认画布分割为2行1列,当前所在第一个区域
plt.subplot(211)
# x可以省略,默认[0,....,N-1]递增,N为y轴的元素个数
plt.plot(range(20,40),marker='o')
plt.grid()
#默认画布分割为2行1列,当前所在第二个区域
plt.subplot(212)
plt.plot(np.arange(12)**2)

同时,如果新建的子图与现有的子图重叠,那么重叠部分的子图会被自动删除,因为他们不可以共享绘图区域.

plt.plot([1,2,3]) # 这个会被后面两个子图覆盖
# 默认画布分割为2行1列,当前所在第一个区域
plt.subplot(211)
# x可以省略,默认[0,....,N-1]递增,N为y轴的元素个数
plt.plot(range(20,40),marker='o')
plt.grid()
#默认画布分割为2行1列,当前所在第二个区域
plt.subplot(212)
plt.plot(np.arange(12)**2)
# 此代码的运行效果如上

如果想要原来的画布不被覆盖,那么就应该新建一个画布,也就是使用figure新建画布

plt.plot([1,2,3])
fig = plt.figure(figsize=(4,2)) # 新建画布
# 默认画布分割为2行1列,当前所在第一个区域
fig.add_subplot(111) # 为新建的画布添加子图
# x可以省略,默认[0,....,N-1]递增,N为y轴的元素个数
plt.plot(range(20,40),marker='o') # plt.plot此时认为画布为fig这个画布
plt.grid()
#默认画布分割为2行1列,当前所在第二个区域
fig.add_subplot(221)
plt.plot(np.arange(12)**2)

同时我们也可以在subplot内部添加一些title,xlabel的参数

plt.subplot(221,title='sub1',xlabel='sub1_x')
plt.plot(np.arange(10)**2)
plt.subplot(222,title='sub2',ylabel='sub2_y')
plt.plot([1,2,3])
plt.tight_layout() # 紧凑布局 防止标签重叠

具体参数可以在subplot参数处按下shift+tab建查看

也可以通过创建区域,然后通过区域的set方法进行设置

# 对返回的区域设置
ax1 = plt.subplot(211)
ax2 = plt.subplot(212)
ax1.set_title('ax1')
ax1.plot(range(50,70))
ax2.set_title('ax2')
ax2.plot(np.arange(12)**2)
plt.tight_layout()

subplots

matplotlib.pyplot模块提供了一个subplots()函数,它的使用方法和subplot()函数类似。其不同之处在于,subplots()既创建了一个包含子图区域的画布,又创建了一个 figure图形对象,而subplot()只是创建一个包含子图区域的画布。

subplots的函数格式如下:

fig , axes = plt.subplots(nrows,ncols)

nrows 与ncols表示两个整数参数,它们指定子图所占的行数、列

函数的返回值是一个元组,包括一个图开附象和所有的 axs对象。其中axes对象的数量等于nrows * ncols,且每个axes 对象均可通过索引值访问(从0开始),如下2行2列数据:

# 创建2行2列的子图,返回图形对象(画布),所有子图的坐标轴
fig,axes = plt.subplots(2,2)
# 第一个区域ax1
ax1 = axes[0][0]
# x轴
x = np.arange(1,5)
# 绘制平方函数
ax1.plot(x,x*x)
ax1.set_title('square')
# 绘制平方根图像
axes[0][1].plot(x,np.sqrt(x))
axes[0][1].set_title('sqrt')
# 绘制指数函数
axes[1][0].plot(x,np.exp(x))
axes[1][0].set_title('exp')
# 绘制对数函数
axes[1][1].plot(x,np.log10(x))
axes[1][1].set_title('log')
# 处理标题遮挡问题
plt.tight_layout()

subplot和subplots的区别

# 绘制1行2列子图中的第1个子图
plt.subplot(121,facecolor='r')
# 绘制2行2列子图中的第2个子图
plt.subplot(222,facecolor='g')
# 绘制2行2列子图中的第3个子图
plt.subplot(224,facecolor='b')

plt.subplot(321,facecolor='r')
plt.subplot(322,facecolor='r')
plt.subplot(323,facecolor='r')
plt.subplot(324,facecolor='r')
plt.subplot(313,facecolor='b')

柱状图

柱状图是一种用矩形柱来表示数据分少的图表。

柱状图可以垂直绘制,也可以水平绘制。

它的高度与其所表示的数值成正比关系。

柱状图显示了不同类别之间的比较关系,图表的水平轴X指定被比较的类别,垂直轴Y则表示具体的类别值

bar

matplotlib.pyplot.bar(x,height,width:float = 0.8, bottom = None,*, align: str = ‘center’, data = None,**kwargs)

  • x表示x坐标,数据类型为float类型,一般为np.arange()生成的固定步长列表
  • height 表示柱状图的高度,也就是y坐标值,数据类型为float类型,一般为一个列表,包含生成柱状图的所有y值.
  • width表示柱状图的宽度,取值在0~1之间,默认值为0.8
  • bottom柱状图的起始位置,也就是y轴的起始坐标,默认值为None.
  • align柱状图的中心位置,“center”,"lege"边缘,默认值为’center’. color柱状图颜色,默认为蓝色
  • alpha透明度,取值在0~1之间,默认值为1.
  • label标签,设置后需要调用plt.legend()生成. edgecolor 边框颜色(ec)
  • linewidth边框宽度,浮点数或类数组,默认为None (lw)
  • tick _label:柱子的刻度标签,字符串或字符串列表,默认值为None.
  • linestyle :线条样式(ls)

这里要求data的数量与x的数量保持一致,否则报错

先来一个简单的柱状图程序

x = range(5) # x坐标
data = [1,2,3,4,5] # y轴对应数据
plt.title('柱状图') # 设置标题
plt.xticks(x) # 设置刻度为x
plt.bar(x,data) # 显示柱状图

现在来介绍不太好理解的参数,bottom,这个参数代表的是柱状图的底部距离x轴的距离

例如bottom为3,那么对应的柱子的起始位置为3而不是0,注意这里的bottom接受的是一个数组,也就是每一个数据对应的离x轴的距离

x = range(5) # x坐标
data = [1,2,3,4,5] # y轴对应数据
bottom = [4,5,6,7,8]
color = ['r','g','b'] # 循环使用三种颜色
plt.title('柱状图') # 设置标题
plt.xticks(x) # 设置刻度为x
plt.bar(x,data,bottom=bottom,color=color,ec='black',ls='--',lw=2) # 显示柱状图

其次由于柱状图主要用于比较数据大小,因此多数据柱状图非常常见,如下

对于这种柱状图需要做到

  • x轴不固定,可能是文字,也可能是数字,因此需要对x轴进行转换
  • 确定同一x轴中,每个柱状图x轴的起始位置
  • 设置图形的宽度
  • 图形2的起始位置=图形2起始位置+图形的宽度
  • 图形3的起始位置=图形3起始位置+2倍图形宽度
  • 需要给每个柱状图循环显示文本内容
  • 显示图例,使得每个颜色的柱子代表的是某种分类
years = ['2010','2012','2014','2016','2018','2020','2022']
plt.figure(figsize=(5,4))
one = [12,7,8,4,9,10,15]
two = [13,4,9,3,2,1,7]
three = [7,4,8,0,1,5,6]
four = [9,4,1,4,1,7,5]
x = np.arange(len(years))
width=0.2
one_x = x
two_x = x + 0.2
three_x = x + 0.2 * 2
four_x = x + 0.2 * 3
plt.xticks(x+width+0.1,labels=years) # 设置x轴名称
for i in range(len(years)):
    plt.text(x[i],one[i],one[i],va='bottom',ha='center')
for i in range(len(years)):
    plt.text(x[i]+0.2,two[i],two[i],va='bottom',ha='center')
for i in range(len(years)):
    plt.text(x[i]+0.2*2,three[i],three[i],va='bottom',ha='center')
for i in range(len(years)):
    plt.text(x[i]+0.2*3,four[i],four[i],va='bottom',ha='center')
plt.bar(one_x,one,width=width)
plt.bar(two_x,two,width=width)
plt.bar(three_x,three,width=width)
plt.bar(four_x,four,width=width)

va和ha代表的分别是vertical和horizental,也就是垂直的和水平的位置

这里需要讲解的首先是xticks为什么要这么写,首先xticks如果不设置,那么默认的x轴刻度名称出现的位置是蓝色柱子的中间,这就是默认的设置,因此为了让图形看起来和谐,需要将下面的刻度移动到四根柱子的中间,那么如果每根柱子的width=0.2,那么要移动到中间,就应该是width+width/2=0.3,因为默认刻度是在中间的,移动到下一根需要width/2

其次就是text的使用,text(x,y,str),首先其实蓝色柱子的x位置还是x这个数组中对应的,我们移动的只是刻度而已,因此需要在蓝色柱子上加上数值标注,需要遍历的是x,而其他颜色的柱子,就需要添加偏移量了.

years = ['2010','2012','2014','2016','2018','2020','2022']
plt.figure(figsize=(5,4))
one = [12,7,8,4,9,10,15]
two = [13,4,9,3,2,1,7]
three = [7,4,8,0,1,5,6]
four = [9,4,1,4,1,7,5]
x = np.arange(len(years))
width=0.2
plt.xticks(x,labels=years) # 设置x轴名称
total=0
plt.bar(x,one,width=width)
# for i in range(len(one)):
three_b = np.zeros(len(one))
for i in range(len(one)):
    three_b[i]=one[i]+two[i]
plt.bar(x,two,bottom=one,width=width)
plt.bar(x,three,bottom=three_b,width=width)
four_b =  np.zeros(len(one))
for i in range(len(one)):
    four_b[i]=one[i]+two[i]+three[i]
plt.bar(x,four,bottom=four_b,width=width)

barh

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

该函数用于生成水平柱状图

barh()函数的用法与bar()函数的用法基本一样,只是在调用barh()函数时使用y参数传入Y轴数据,使用width参数传入代表条柱宽度的数据,left参数类似于bar函数的bottom,只不过这里代表的是柱子离左侧的距离

one = [12,7,8,4,9,10,15]
years = ['2010','2012','2014','2016','2018','2020','2022']
plt.barh(years,one)

years = ['2010','2012','2014','2016','2018','2020','2022']
plt.figure(figsize=(5,4))
one = [12,7,8,4,9,10,15]
two = [13,4,9,3,2,1,7]
three = [7,4,8,0,1,5,6]
y = np.arange(len(years))
y_2 = y + 0.2
y_3 = y + 0.2 * 2
height=0.2
plt.yticks(y+0.2,years)
plt.barh(y,one,height=height)
plt.barh(y_2,two,height=height)
plt.barh(y_3,three,height)

这里也可以自己练习一下,使用text为每一行表上值

相关文章
|
2月前
|
数据可视化 数据挖掘 Linux
震撼发布!Python数据分析师必学,Matplotlib与Seaborn数据可视化实战全攻略!
在数据科学领域,数据可视化是连接数据与洞察的桥梁,能让复杂的关系变得直观。本文通过实战案例,介绍Python数据分析师必备的Matplotlib与Seaborn两大可视化工具。首先,通过Matplotlib绘制基本折线图;接着,使用Seaborn绘制统计分布图;最后,结合两者在同一图表中展示数据分布与趋势,帮助你提升数据可视化技能,更好地讲述数据故事。
49 1
|
3月前
|
数据采集 数据可视化 数据挖掘
数据分析大神养成记:Python+Pandas+Matplotlib助你飞跃!
在数字化时代,数据分析至关重要,而Python凭借其强大的数据处理能力和丰富的库支持,已成为该领域的首选工具。Python作为基石,提供简洁语法和全面功能,适用于从数据预处理到高级分析的各种任务。Pandas库则像是神兵利器,其DataFrame结构让表格型数据的处理变得简单高效,支持数据的增删改查及复杂变换。配合Matplotlib这一数据可视化的魔法棒,能以直观图表展现数据分析结果。掌握这三大神器,你也能成为数据分析领域的高手!
77 2
|
2月前
|
存储 数据可视化 数据挖掘
揭秘!Matplotlib与Seaborn联手,如何让Python数据分析结果一目了然,惊艳全场?
在数据驱动时代,高效直观地展示分析结果至关重要。Python中的Matplotlib与Seaborn是两大可视化工具,结合使用可生成美观且具洞察力的图表。本文通过分析某电商平台的商品销量数据集,展示了如何利用这两个库揭示商品类别与月份间的销售关系及价格对销量的影响。首先使用Matplotlib绘制月份销量分布直方图,再借助Seaborn的箱线图进一步探索不同类别和价格区间下的销量稳定性。
63 10
|
2月前
|
机器学习/深度学习 数据可视化 数据挖掘
数据可视化大不同!Python数据分析与机器学习中的Matplotlib、Seaborn应用新视角!
在数据科学与机器学习领域,数据可视化是理解数据和优化模型的关键。Python凭借其强大的可视化库Matplotlib和Seaborn成为首选语言。本文通过分析一份包含房屋面积、卧室数量等特征及售价的数据集,展示了如何使用Matplotlib绘制散点图,揭示房屋面积与售价的正相关关系;并利用Seaborn的pairplot探索多变量间的关系。在机器学习建模阶段,通过随机森林模型展示特征重要性的可视化,帮助优化模型。这两个库在数据分析与建模中展现出广泛的应用价值。
48 2
|
2月前
|
数据可视化 数据挖掘 Python
逆袭之路!Python数据分析新手如何快速掌握Matplotlib、Seaborn,让数据说话更响亮?
在数据驱动时代,掌握数据分析技能至关重要。对于Python新手而言,Matplotlib和Seaborn是数据可视化的两大利器。Matplotlib是最基本的可视化库,适合绘制基础图表;Seaborn则提供高层次接口,专注于统计图形和美观样式。建议先学Matplotlib再过渡到Seaborn。快速上手Matplotlib需多实践,示例代码展示了绘制折线图的方法。Seaborn特色功能包括分布图、关系图及分类数据可视化,并提供多种主题和颜色方案。两者结合可实现复杂数据可视化,先用Seaborn绘制统计图,再用Matplotlib进行细节调整。熟练掌握这两者,将显著提升你的数据分析能力。
46 4
|
2月前
|
数据可视化 数据挖掘 Python
惊呆了!Python数据分析师如何用Matplotlib、Seaborn秒变数据可视化大师?
在数据驱动时代,分析师们像侦探一样在数字海洋中寻找线索,揭示隐藏的故事。数据可视化则是他们的“魔法棒”,将复杂数据转化为直观图形。本文将带你探索Python数据分析师如何利用Matplotlib与Seaborn这两大神器,成为数据可视化大师。Matplotlib提供基础绘图功能,而Seaborn在此基础上增强了统计图表的绘制能力,两者结合使数据呈现更高效、美观。无论是折线图还是箱形图,这两个库都能助你一臂之力。
43 4
|
2月前
|
数据采集 数据可视化 数据挖掘
数据分析大神养成记:Python+Pandas+Matplotlib助你飞跃!
【9月更文挑战第2天】数据分析大神养成记:Python+Pandas+Matplotlib助你飞跃!
56 5
|
3月前
|
数据可视化 数据挖掘 API
Python数据分析:数据可视化(Matplotlib、Seaborn)
数据可视化是数据分析中不可或缺的一部分,通过将数据以图形的方式展示出来,可以更直观地理解数据的分布和趋势。在Python中,Matplotlib和Seaborn是两个非常流行和强大的数据可视化库。本文将详细介绍这两个库的使用方法,并附上一个综合详细的例子。
|
4月前
|
数据可视化 数据挖掘 Python
数据界的颜值担当!Python数据分析遇上Matplotlib、Seaborn,可视化美出新高度!
【7月更文挑战第24天】在数据科学领域,Python的Matplotlib与Seaborn将数据可视化升华为艺术,提升报告魅力。Matplotlib作为基石,灵活性强,新手友好;代码示例展示正弦波图的绘制与美化技巧。Seaborn针对统计图表,提供直观且美观的图形,如小提琴图,增强数据表达力。两者结合,创造视觉盛宴,如分析电商平台销售数据时,Matplotlib描绘趋势,Seaborn揭示类别差异,共塑洞察力强的作品,使数据可视化成为触动人心的艺术。
62 7
|
4月前
|
数据可视化 数据挖掘 Python
惊呆了!Python数据分析师如何用Matplotlib、Seaborn秒变数据可视化大师?
【7月更文挑战第24天】在数据驱动时代,分析师穿梭数字海洋揭示故事,数据可视化如魔法棒般将复杂数据转化成直观图形。Matplotlib与Seaborn成为黄金搭档:前者作为基础绘图库提供高度定制化选项;后者在其上构建,简化复杂图表绘制并增强美观度。两者结合,助力分析师高效完成任务。
35 6

热门文章

最新文章