小笨蛋学习Python6第六集


python基础知识6

本节的主题是matplotlib相关知识要点

一、matplotlib是什么?

matplotlib是Python2D绘图库。
学习matplotlib能将数据可视化,更直观的呈现。使得数据更加客观,有说服力。

二、常见图形种类以及意义

1.折线图:

折线图:以折线的上升或下降表示数据的增减变化的统计图。
特点:可以显示数据的变化趋势,反映事物的变化情况。(变化)

2.散点图:

散点图:用两组数据构成多个坐标点,考察坐标点的分布,判断两变量之间是否存在某种关联关系或总的坐标点的分布模式。
特点:判断两变量之间是否存在数量关联趋势,展示离群点(分布规律)。

3.柱状图:

柱状图:排列在工作表的列或行中的数据可以绘制到柱状图中。
特点:绘制离散的数据,能够一眼看出各个数据的大小,比较数据之间的差别(统计、对比)。

4.直方图:

由一系列高度不等的纵向条纹或线段表示数据分布的情况,一般横轴表示数据范围,纵轴表示数据分布情况。
特点:绘制连续性的数据展示一组或多组的分布状况(统计)

5.饼图:

用于表示不同分类的占比情况,通过弧度大小对比各种分类。
特点:分类数据的占比情况。

三、matplotlib的简单实现

#导入模块
import matplotlib.pyplot as plt
#在jupter notebook中执行的时候显示图片
%matplotlib inline 
#传入x和y,通过plot画图
plt.plot([1,0,9],[4,5,6])
#在执行的时候展示图形
plt.show()

显示:
在这里插入图片描述

四、对matplotlib图像结构的认识

我们可以把matplotlib图像分为三层:
1、第一层是底层的容器,主要包括Canvas\Figure\Axes;
2、第二层是辅助显示层,主要包括axis\spines\grid\legend\title等;
3、第三层为图像层,即通过plot\scatter等方法绘制图像
在这里插入图片描述

五、折线图

1.折线图的绘制:

#绘制折线图
from matplotlib import pyplot as plt
x=range(1,8)
y=[17,17,18,15,11,11,13] 
#传入想x,y之后,通过plot画图
plt.plot(x,y) 
plt.show()

图片显示:
在这里插入图片描述

2.设置折线的颜色和形状

#设置折线的颜色和形状
from matplotlib import pyplot as plt 
x=range(1,8)
y=[17,17,18,15,11,11,13] 
plt.plot(x,y,color="red",alpha=0.5,linestyle="--",linewidth=3) 
#分别是alpha=0.5:表示折线的透明度(0-1)
      #linestyle="--":表示折线的样式
      #linewidth=3:表示折线的宽度
#线的样式:
'''- :实线(solid)
--:短线(dashed)
-.短点相间线(dashdot)
:虚点线(dotted)'''

plt.show()

在这里插入图片描述

3.设置折点样式

#3.设置折点样式
from matplotlib import pyplot as plt 
x=range(1,8)
y=[17,17,18,15,11,11,13] 
#传入想x,y之后,通过plot画图
plt.plot(x,y,marker="o",color="red",markersize="20",markeredgecolor="g",markeredgewidth=5)
plt.show()

在这里插入图片描述折点形状设置:
在这里插入图片描述

4.设置图片的大小和保存

from matplotlib import pyplot as plt
import random 
x=range(2,26,2)#x的位置
y=[random.randint(15,30)for i in x]
#设置图片的大小
plt.figure(figsize=(20,8),dpi=80)#(figsize:指定figure的宽和高,单位为英寸;
#dpi=80表示绘图对象的分辨率,即每英寸多少个像素,缺省值为80,1英寸等于2.5厘米,a4值是21*30d 纸张)
plt.plot(x,y)#传入x,y,通过plot绘制图形;
plt.show()
#保存(要放在绘制的下面,并且plt.show()会释放figure资源,如果在显示图像之后保存图片将只能保存将只能保存空图片)
plt.savefig("./t1.png")#图片的格式也可以修改为其他格式,类似于svg等;

在这里插入图片描述

5.设置x轴和y轴的刻度

from matplotlib import pyplot as plt
x=range(2,26,2)
y=[random.randint(15,30)for i in x]
plt.figure(figsize=(20,8),dpi=80)

#设置x轴的刻度
#plt.xticks(x) 
#plt.xticks(range(1,25))
#设置y轴的刻度
#plt.yticks(y)
#plt.ticks(range(min(y),max(y)+1))

#设置x轴的刻度标签
x_ticks_label=["{}:00".format(i)for i in x]
plt.xticks(x,x_ticks_label,rotation=45)

#设置y轴的刻度标签
y_ticks_label=["{}℃".format(i)for i in range(min(y),max(y)+1)]
plt.yticks(range(min(y),max(y)+1),y_ticks_label)

#x绘制图片,显示图片
plt.plot(x,y)
plt.show()

在这里插入图片描述

6.设置显示中文

需要通过font_manager来解决matplotlib无法显示中文的问题。

from matplotlib import pyplot as plt 
import matplotlib
import random 
x=range(0,120)
y=[random.randint(10,30)for i in range(120)]
#设置画布的大小和分辨率
plt.figure(figsize=(20,8),dpi=80)
#传入参数x,y
plt.plot(x,y)
#导入字体管理模块,并找到自己电脑上的字体存储路径
from matplotlib import font_manager
my_font=font_manager.FontProperties(fname="C:/Windows/Fonts/STFANGSO.TTF",size=18)
#设置x轴,并将字体旋转45度
plt.xlabel("时间",rotation=45,fontproperties=my_font)
#设置y轴
plt.ylabel("次数",fontproperties=my_font)
#设置标题
plt.title("每分钟跳动次数",color="red",fontproperties=my_font)
#绘制图形
plt.show()

在这里插入图片描述

7.一图多线

#假设公司想要统计A部门和B部门在过去24个月里公司新增人数,其数量列表如y1和y2所示,
#请在一个图中绘制出该数据的折线图,从而分析每年两部门新增人数的数量趋势。
y1=[1,2,3,5,4,3,6,4,2,0,4,2,3,5,6,8,2,1,5,3,2,6,7,2]
y2=[1,2,1,2,1,2,3,2,2,2,2,5,3,6,1,2,2,1,1,1,1,1,2,4]
x=range(1,25)
plt.figure(figsize=(20,8),dpi=80)
#设置折线颜色和图例
plt.plot(x,y1,color="red",label="A部门")
plt.plot(x,y2,color="blue",label="B部门")
#设置x轴刻度
xtick_labels=["第{}周".format(i)for i in x]
my_font=font_manager.FontProperties(fname="C:/Windows/Fonts/STFANGSO.TTF",size=18)
plt.xticks(x,xtick_labels,fontproperties=my_font,rotation=45)
#绘制网格
plt.grid(alpha=0.4)
#添加图例,设置位置
plt.legend(prop=my_font,loc="upper right")
#绘制图形
plt.show()

在这里插入图片描述
注意:绘制网格也是设置线的格式。alpha=0.4是在设置透明度。
添加图例,只有在这里是添加prop参数是显示中文,其他的都用fontproperties
设置位置loc:upper left\lower left\center left\upper center

7.1拓展一(一图多个坐标子系图)

采用add_subplot方法。

#add_subplot方法,给figure新增子图
import numpy as np 
import matplotlib.pyplot as plt
x=np.arange(1,100)

#新建figure对象
fig=plt.figure(figsize=(20,10),dpi=80)

#新建子图1:
ax1=fig.add_subplot(2,2,1)
ax1.plot(x,x)
#新建子图2:
ax2=fig.add_subplot(2,2,2)
ax2.plot(x,x**2)
ax2.grid(color="r",linestyle="--",linewidth=1,alpha=0.3)
#新建子图3:
ax3=fig.add_subplot(2,2,3)
ax3.plot(x,np.log(x))

#绘制图形
plt.show()

在这里插入图片描述

7.2拓展二(设置坐标范围)

import matplotlib.pyplot as plt
import numpy as np 
x=np.arange(-10,11,1)
y=x**2 
plt.plot(x,y)

#可以调整x,y的起点
plt.ylim(ymin=0)
plt.xlim(xmin=0)

plt.show()

在这里插入图片描述

7.3拓展三(改变坐标轴的默认显示方式)

#改变坐标轴的默认显示方式
import matplotlib.pyplot as plt
import numpy as np
y=range(0,14,2)
x=[-3,-2,-1,0,1,2,3]

#获取当前图表的图像
ax=plt.gca()

#设置图形的包围线
ax.spines["right"].set_color("none")
ax.spines["top"].set_color("none")
ax.spines["bottom"].set_color("blue")
ax.spines["left"].set_color("red")
#设置底边的移动范围,移动到y轴的0位置
#data:移动轴的位置到交叉轴的指定坐标
ax.spines["bottom"].set_position(("data,0"))
ax.spines["left"].set_position(("data,1"))

plt.plot(x,y)
plt.show()

在这里插入图片描述

8.绘制散点图

#“题干:3月份每天的最高温度”
#a=[11,17,16,11,12,11,12,6,6,7,8,9,12,15,14,17,18,21,16,17,20,14,15,15,15,19,21,22,22,22,23]
from matplotlib import pyplot as plt 
from matplotlib import font_manager
import numpy as np 
y=[11,17,16,11,12,11,12,6,6,7,8,9,12,15,14,17,18,21,16,17,20,14,15,15,15,19,21,22,22,22,23]
x=range(1,32)

#设置图形大小
plt.figure(figsize=(20,8),dpi=80) 
#使用scatter绘制散点图
size=np.random.randint(0,100,31)
plt.scatter(x,y,label="3月份",alpha=0.5,s=size,c="g")

#绘制x轴的刻度
my_font=font_manager.FontProperties(fname="C:/Windows/Fonts/STFANGSO.TTF",size=18)

_xticks_labels=["3月{}日".format(i)for i in x]
plt.xticks(x[::3],_xticks_labels[::3],fontproperties=my_font,rotation=45)

_yticks_labels=["{}℃".format(i)for i in range(min(y),max(y)+1)]
plt.yticks(range(min(y),max(y)+1),_yticks_labels)

plt.xlabel("日期",fontproperties=my_font)
plt.ylabel("温度",fontproperties=my_font)

#图例
plt.legend(prop=my_font)

plt.show()

在这里插入图片描述

9.绘制条形图

#绘制条形图——假设拿到了电影列表[a]与电影票房数据[b],请展示该数据。

#"""a=["流浪地球","疯狂的外星人","飞驰人生","大黄蜂","熊出没.原始时代","新喜剧之王"]
#   b=["38.13","19.85","14.89","11.36","6.47","5.93"]"""
from matplotlib import pyplot as plt 
from matplotlib import font_manager
a=["流浪地球","疯狂的外星人","飞驰人生","大黄蜂","熊出没.原始时代","新喜剧之王"]
b=[38.13,19.85,14.89,11.36,6.47,5.93]
my_font=font_manager.FontProperties(fname="C:/Windows/Fonts/STFANGSO.TTF",size=18)

plt.figure(figsize=(20,8),dpi=80)
#绘制条形图
rects=plt.bar(a,[float(i) for i in b],width=0.3,color=["r","g","b","r","g","b"])
plt.xticks(range(len(a)),a,fontproperties=my_font)
plt.yticks(range(0,41,5),range(0,41,5))
#给图形加上标注(水平居中)
for rect in rects:
    height=rect.get_height()    plt.text(rect.get_x()+rect.get_width()/2,height+0.3,str(height),ha="center")    
plt.show()

在这里插入图片描述
对比一下横向条形图:

#横向条形图
from matplotlib import pyplot as plt 
from matplotlib import font_manager
a=["流浪地球","疯狂的外星人","飞驰人生","大黄蜂","熊出没.原始时代","新喜剧之王"]
b=[38.13,19.85,14.89,11.36,6.47,5.93]
my_font=font_manager.FontProperties(fname="C:/Windows/Fonts/STFANGSO.TTF",size=18)

plt.figure(figsize=(20,8),dpi=80)

#绘制横向条形图
plt.barh(range(len(a)),b,height=0.5,color=["r","g","b","r","g","b"])          
plt.yticks(range(len(a)),a,fontproperties=my_font,rotation=45)

#在条形图上加上标注:
for rect in rects:
    width=rect.get_width() 
    plt.text(width,rect.get_y()+0.3/2,str(width),va="center")
plt.show()

在这里插入图片描述
这个结果出来没有标注,不知道哪里出来问题?
下面来看一个并列、罗列条形图。

并列条形图
from matplotlib import pyplot as plt 
import numpy as np
index=np.arange(4)
BJ=[50,55,53,60]
SH=[44,66,55,41]
#并列
plt.bar(index,BJ,width=0.3)
plt.bar(index+0.3,SH,width=0.3,color="green")
plt.xticks(index+0.3/2,index)

plt.show()

在这里插入图片描述

罗列条形图
from matplotlib import pyplot as plt 
import numpy as np
index=np.arange(4)
BJ=[50,55,53,60]
SH=[44,66,55,41]
#罗列
plt.bar(index,BJ,width=0.3)
plt.xticks(index+0.3/2,index)
plt.bar(index,SH,bottom=BJ,width=0.3,color="green")

plt.show()

在这里插入图片描述

10.直方图

import matplotlib.pyplot as plt
import numpy as np
import matplotlib

# 设置matplotlib正常显示中文和负号
matplotlib.rcParams['font.sans-serif']=['SimHei']   # 用黑体显示中文
matplotlib.rcParams['axes.unicode_minus']=False     # 正常显示负号
# 随机生成(10000,)服从正态分布的数据

```python
data = np.random.randn(10000)
"""
绘制直方图
data:必选参数,绘图数据
bins:直方图的长条形数目,可选项,默认为10
normed:是否将得到的直方图向量归一化,可选项,默认为0,代表不归一化,显示频数。normed=1,表示归一化,显示频率。
facecolor:长条形的颜色
edgecolor:长条形边框的颜色
alpha:透明度
"""
plt.hist(data, bins=40, normed=0, facecolor="blue", edgecolor="black", alpha=0.7)
# 显示横轴标签
plt.xlabel("区间")
# 显示纵轴标签
plt.ylabel("频数/频率")
# 显示图标题
plt.title("频数/频率分布直方图")
plt.show()

在这里插入图片描述

11.饼图

#饼状图
import matplotlib.pyplot as plt 
import matplotlib
from matplotlib import font_manager
my_font=font_manager.FontProperties(fname="C:/Windows/Fonts/STFANGSO.TTF",size=10)
label_list=["第一部分","第二部分","第三部分"]
size=[55,35,10]
color=["r","g","b"]
explode=[0,0.05,0]

plt.figure(figsize=(20,8),dpi=100)
#patches扇形实例
#l_text列表标签实例
#p_text百分比标签实例
patches,l_text,p_text=plt.pie(size,
                             explode=explode,#每一块离开圆心的距离
                             colors=color,
                             labels=label_list,#每块图外侧的标签说明
                             labeldistance=1.1,#设置标签文本距离圆心位置,1.1倍表示1.1倍半径
                             autopct="%1.1f%%",#控制饼图内百分比设置
                             shadow=False,#设置是否有阴影
                             startangle=90,#起始绘制角度,默认从x正轴方向逆时针画起;设定90则说明从y轴正方向画起
                             pctdistance=0.6#类似于labeldistance,默认值是0.6
                             )
for t in l_text:
    print(dir(t))
    t.set_fontproperties(my_font)
for t in p_text:
    t.set_size(18)
for i in patches:
    i.set_color("pink")
    break

plt.legend(prop=my_font,loc="upper right")

plt.show()

在这里插入图片描述

12.总结

在这里插入图片描述

13.小作业:

实现一个饼图,并增加阴影效果和破裂效果

from matplotlib import pyplot as plt 
from matplotlib import font_manager
my_font=font_manager.FontProperties(fname="C:/Windows/Fonts/STFANGSO.TTF",size=14)
x=[15,30,45,10] 
label_list=["Frogs","Hogs","Dogs","Logs"]
color=['blue','orange','green','red']
explode=[0,0.1,0,0]
plt.figure(figsize=(15,15),dpi=100)

patches,l_text,p_text = plt.pie( x,
                                labels = label_list,
                                colors = color,
                                explode = explode,
                                labeldistance = 1.1,
                                autopct = '%1.1f%%',
                                shadow = True,
                                startangle = 90,
                                pctdistance = 0.6)                            
plt.legend(prop=my_font,loc="upper right")
plt.show()

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值