数据分析:数据可视化2


在开启今天的学习之前,请大家先下载这节课我们会用到的 演示资料

中文显示

还记得上次的习题课中给大家留下的坑吗?其实matplotlib是支持unicode编码的,但是如果我们不进行额外设置的话,就会因为没有找到合适的中文字体而显示乱码。想要Matplotlib显示中文我们可以使用三种方法:
第一种:直接修改Matplotlib配置文件matplotlibrc第二种:动态修改配置 第三种:设置自定义字体。本节课我们主要讲解第三种方法,因为自定义的字体自由度比较高,同时也方便我们在一个图中使用不同风格的字体。
Windows中有许多内置的中文字体,默认储存的路径为:c:\windows\fonts\。我们找到该路径:
在这里插入图片描述
我们随意找一种字体,然后打开它的属性:
在这里插入图片描述
记住这个位置的信息,在设置字体的时候会用到。
在我们学过的部分中,涉及到使用中文的部分目前有x轴和y轴的标题,以及图片的标题。下面我们就先来说说这三部分内容怎样设置成中文:

from matplotlib import font_manager
# 设置my_font1使用隶书10号字
my_font1 = font_manager.FontProperties(fname=r"c:\windows\fonts\SIMLI.TTF", size=15)
# 设置my_font2使用微软雅黑常规20号字
my_font2 = font_manager.FontProperties(fname=r"c:\windows\fonts\msyh.ttc", size=20)

# 设置表格标题使用中文字体my_font2,x和y轴标题使用中文字体my_font1
plt.xlabel('x轴标题',fontproperties=my_font1)
plt.ylabel('y轴标题',fontproperties=my_font1)
plt.title('图片标题',fontproperties=my_font2)

plt.show()

我们来看看运行结果:
在这里插入图片描述
看,效果是不是还不错~
from matplotlib import font_manager导入了字体管理模块,font_manager.FontProperties()使用这个方法可以根据我们提供的字体文件创建字体对象。这种方法创建好的字体对象添加到需要中文显示的地方,就可以显示出中文了。在后面的内容中,我们还可以给图例添加成中文形式,方法也十分类似。

自定义X轴刻度

下面我们用演示资料绘一幅图,依据日期(x)和开盘价(y)画图,看看会是怎样的结果:

import pandas as pd
from matplotlib import pyplot as plt
from matplotlib import font_manager
my_font = font_manager.FontProperties(fname=r"c:\windows\fonts\msyh.ttc", size=10)
df = pd.read_excel('600001SH.xlsx')
x = df['日期'].values.tolist() # 取出df中日期列的值,并转换成列表
y = df['开盘价(元)'].values.tolist() # 取出开盘价一列的值并转换为列表

plt.plot(x,y)
plt.xlabel('日期',fontproperties=my_font)
plt.ylabel('元(¥)',fontproperties=my_font)
plt.title('开盘时间',fontproperties=my_font)

plt.show()

在这里插入图片描述
x轴的刻度出现了严重的重叠问题,这样会非常影响我们的分析。造成这个结果的主要原因为:

  1. 刻度的文字过长,但是图片的宽度不够。
  2. x轴和y轴刻度会默认根据x值和y值生成,并且Matplotlib默认会生成它认为合适的刻度间距。
    那么我们先把图片的宽度设置长一点,看看会不会有所改善。matplotlib中提供了由我们设置图片大小的方法,语句如下:
plt.figure(figsize=(a, b), dpi=dpi)

其中: figsize 设置图形的大小,a为图形的宽, b为图形的高,dpi为设置每英寸多少个像素点。
下面我们拉长图片看是否可以解决问题:

import pandas as pd
from matplotlib import pyplot as plt
from matplotlib import font_manager
my_font = font_manager.FontProperties(fname=r"c:\windows\fonts\msyh.ttc", size=10)

df = pd.read_excel('600001SH.xlsx')
x = df['日期'].values.tolist() # 取出df中日期列的值,并转换成列表
y = df['开盘价(元)'].values.tolist() # 取出开盘价一列的值并转换为列表
plt.figure(figsize=(20,10), dpi=80) # 设置画布大小要放到绘图之前
plt.plot(x,y)
plt.xlabel('日期',fontproperties=my_font)
plt.ylabel('元(¥)',fontproperties=my_font)
plt.title('开盘时间',fontproperties=my_font)
plt.show()

在这里插入图片描述
图片确实拉长了很多,但是效果也并不理想。看来我们还是要通过调整x轴的刻度来实现。
Matplot之中同样为我们准备好了调整x轴刻度的方法,它就是xticks:

xticks(ticks=None, labels=None, **kwargs) 

该方法中,ticks是个列表参数,表示x轴的刻度线显示刻度标签地方,第二个参数为列表参数,用于表示具体x轴显示的具体刻度值以及显示的步长值,当这个参数没有进行给定时,会自动按照ticks的设置显示x轴的具体刻度。第三个参数可以标定旋转角度,我们来看个例子:

from matplotlib import pyplot as plt
plt.xticks(range(0,13,3),rotation=45)
plt.show()

在这里插入图片描述
由于没有第二个参数,所以认为ticks可以标定横坐标有5个标签,数字范围是0到12,步长为3。rotation=45表示显示的数字旋转45度。

x=range(20)
plt.xticks(x[2:16:3],rotation=45)
plt.show()

在这里插入图片描述
先设置x的范围为0到20,然后设置x轴显示范围为从2开始到15结束步长为3。x[2:16:3]是切片语法的一种,第一个冒号前后的数字表示取值范围,第二个冒号后面的数字表示的是步距。这里如果我们需要设置x轴显示0到19的所有数,步长为2,那么代码可以写成:

x=range(20)
plt.xticks(x[::2],rotation=45)

大家可以自己试一试。
当ticks和labels传递的列表范围和步长不同时,会默认以labels为准,因为第一个参数主要的作用还是用列表的数量规定x轴有多少标签,以及标签之间的距离大小是多少。不过一般我们需要这两个参数一样,否则绘制出的图片x轴标签和图片会不对应:

from matplotlib import pyplot as plt
x=range(20)
plt.xticks(range(10),x[::2],rotation=45)
plt.plot(x,x,color='red')
plt.show()

在这里插入图片描述

另外需要注意的是,ticks列表的列表长度和labels传递的列表长度应当相同,因为如果x轴上的刻度标签数量和需要显示出的数字数量不匹配,计算机会报错。
当然,如果我们想要消除x轴的坐标显示也可以实现:

x=range(20)
plt.xticks([])
plt.show()

在这里插入图片描述
至此,自定义x轴刻度的学习就完成了。我们继续来修改刚才那副图:

import pandas as pd
from matplotlib import pyplot as plt
from matplotlib import font_manager
my_font = font_manager.FontProperties(fname=r"c:\windows\fonts\msyh.ttc", size=16)
df = pd.read_excel('600001SH.xlsx')
x = df['日期'].values.tolist()
y = df['开盘价(元)'].values.tolist()

plt.figure(figsize=(20,10),dpi=80)
plt.plot(x,y)
plt.xlabel('日期',fontproperties=my_font)
plt.ylabel('元(¥)',fontproperties=my_font)
plt.title('开盘时间',fontproperties=my_font)
# 自定义x轴刻度显示
plt.xticks(range(0,len(x),3),x[::3],rotation=45)
plt.show()

我们来看看结果:
在这里插入图片描述
结果还是很让人满意的~

一图多线

有些时候,一个曲线显示出的效果不能满足我们的需求,比如我们想要对比开盘价和收盘价,那么画两张折线图展示的效果远没有一张图片上显示这两部分内容来的清晰。画一个折线的方法是使用一个plt.plot()方法,那么如果我们使用两个plt.plot()方法是不是能完成任务?

import pandas as pd
from matplotlib import pyplot as plt
from matplotlib import font_manager
my_font = font_manager.FontProperties(fname=r"c:\windows\fonts\msyh.ttc", size=16)
df = pd.read_excel('600001SH.xlsx')
x = df['日期'].values.tolist()
y1 = df['开盘价(元)'].values.tolist()
y2 = df['收盘价(元)'].values.tolist()

plt.figure(figsize=(20,10),dpi=80)
plt.plot(x,y1)
plt.plot(x,y2)
plt.xlabel('日期',fontproperties=my_font)
plt.ylabel('元(¥)',fontproperties=my_font)
plt.title('开盘时间',fontproperties=my_font)

plt.xticks(range(0,len(x),3),x[::3],rotation=45)
plt.show()

看看效果:
在这里插入图片描述
确实有两个折线图了,但是新的问题又来了,我们单从图片上看不出来哪个是哪个…
想要解决这个问题就需要加一个图例,告诉我们每条线的意义是什么。这就需要.legend()方法。但是这个方法比较特殊,一共需要两步才能添加图例:

import pandas as pd
from matplotlib import pyplot as plt
from matplotlib import font_manager
my_font = font_manager.FontProperties(fname=r"c:\windows\fonts\msyh.ttc", size=16)
df = pd.read_excel('600001SH.xlsx')
x = df['日期'].values.tolist()
y1 = df['开盘价(元)'].values.tolist()
y2 = df['收盘价(元)'].values.tolist()

plt.figure(figsize=(20,10),dpi=80)
plt.plot(x,y1,label='开盘价') # 设置图例显示文字为“开盘价”
plt.plot(x,y2,label='收盘价') # 设置图例显示文字为“收盘价”
plt.xlabel('日期',fontproperties=my_font)
plt.ylabel('元(¥)',fontproperties=my_font)
plt.title('开盘时间',fontproperties=my_font)
# 添加图例,设置字体
plt.legend(prop=my_font)
plt.xticks(range(0,len(x),3),x[::3],rotation=45)
# .grid()方法可以为图片添加网格
# alpha可以设置网格的透明度,范围为0~1
plt.grid(alpha=0.4)
plt.show()

在这里插入图片描述
我们使用.legend()方法和.grid()方法为图片添加了图例和网格,这样显示的效果就好了很多。

单图层多画布

上面的学习都是在一个画布上创建一个坐标系,上节课介绍到一个画布上是可以分成多个区域,每个区域都可以绘制一个图像,这里的每个图像称为一个子图。
调用plt.subplot()函数就可以在画布上创建一个子图,plt.subplot()的使用方法如下:

plt.subplot(nrows, ncols, index)

函数的 nrows 参数指定将数据图区域分成多少行;ncols 参数指定将数据图区域分成多少列;index 参数指定获取第几个区域。
在这里插入图片描述
Axes1、Axes2、Axes3、Axes4分别代表四个区域。
如果我们这样写:

plt.subplot(2,2,3)

表示该显示层最多可以放置四个画布,一行可以放置两张画布,一共有两行。3表示这张画布的位置是第二行第一列:

import pandas as pd
from matplotlib import pyplot as plt
import math
x = range(0,10)
x1=[]
for i in range(0,100):
    x1.append(i/10.0)
y1 = [i**2 for i in range(0,10)] # **为乘方符号
y3 = [i**0.5 for i in x1]
plt.subplot(2, 2, 1) # 设置为第一行第一张图
plt.plot(x,y1,color='red',label='x^2')

plt.subplot(2, 2, 3) # 设置为第二行第一张图
plt.plot(x1,y3,color='green',label='x^1/2')
plt.grid(alpha=0.4)
plt.legend() # 图例中不需用中文,可以不添加参数
plt.show()

在这里插入图片描述
图像的位置关系大家应该清楚了,但是又有一个问题,我们的第一张图没有成功添加网格和图例。这是因为每个画布都是有自己的独立性的,添加网格和图例等必须在对应画布内单独设置:

import pandas as pd
from matplotlib import pyplot as plt
import math
from matplotlib.font_manager import FontProperties
my_font = FontProperties(fname=r"c:\windows\fonts\msyh.ttc", size=10)
x = range(0,10)
x1=[]
for i in range(0,100):
    x1.append(i/10.0)
y1 = [i**2 for i in range(0,10)]
y2 = [i**3 for i in range(0,10)]
y3 = [i**0.5 for i in x1]
plt.subplot(2, 2, 1) # 第一幅图
plt.plot(x,y1,color='red',label='x^2')
plt.legend(prop=my_font)
plt.grid(alpha=0.4)
plt.subplot(2, 2, 2) # 第二幅图
plt.plot(x,y2,color='yellow',label='x^3')
plt.legend(prop=my_font)
plt.grid(alpha=0.4)
plt.subplot(2, 2, 3) # 第三幅图
plt.plot(x1,y3,color='green',label='x^1/2')
plt.grid(alpha = 0.4)
plt.legend(prop = my_font)
plt.show()

在这里插入图片描述
今天就给大家介绍到这里了,这次主要讲述了如何设置显示自定义中文字体,如何调整画布的长宽和单位英寸像素以及如何使用xticks()方法自定义x轴的刻度,以及一张画布设置多条折线,使用.subplot()方法设置单图层多画布,下节我们会继续讲柱状图,散点图等,我们一起期待吧~

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值