本文是视频Python数据分析三剑客 数学建模基础 numpy、pandas、matplotlib的学习笔记。
————————————————————————————————————————————————————
matplotlib是一个Python的2D图形包。pyplot封装了很多画图的函数。
import matplotlib.pyplot as plt
import numpy as np
matplotlib. pyplot包含一系列类似 MATILAB中绘图函数的相关函数。
每个matplotlib. pyplot中的函数对当前的图像进行一些修改 ,例如:产生新的图像,在图 像中产生新的绘图区域,在绘图区域中画线,给绘图加上标记,等等… matplotlib. pyplot会自动记住当前的图像和绘图区域,因此这些函数会直接作用在当前 的图像上。 在实际的使用过程中,常常以plt作为matplotlib. pyplot的省略。
默认情况下, matplotlib. pyplot不会直接显示图像,调用plt. show()函数时,图像才会显示出来。
plt. show()默认是在新窗口打开一幅图像 ,且提供了对图像进行操作的按钮。
不过在ipython命令行中,我们可以将它插入notebook中,并且不需要调用plt. show()也可以显示:
plt.plot()函数主要用于折线图的绘制。
plot()函数参数解释:
plt.plot(x, y, format_string, **kwargs)
x
: X轴数据,列表或数组,可选
y
: Y轴数据,列表或数组 format_string 控制曲线的格式字符串,可选
**kwargs
第二组或更多(x,y,format_string),可画多条曲线
来自:https://blog.csdn.net/weixin_44010756/article/details/109326364
具体函数参数参见:plt.plot()函数详解
二、Matplotlib系列—pyplot的plot( )函数
plot函数基本的用法: 指定x和y
●plt. plot(x, y)
默认参数, x为0~N-1
●plt. plot(y)
plt.plot([1,2,3,4])
plt.ylabel('y')
plt.xlabel('x')#使用中文会出现乱码
在上面的例子中,我们没有给定x的值,所以其默认值为[0, 1, 2, 3]。
传入x,y:
plt.plot([1,2,3,4],[1,4,9,16])
plt.show()#不显示内存
可以用字符来设定图像的格式。
plt.plot([1,2,3,4],[1,4,9,16],'ro')
plt.show()
与matlab类型,可以使用axis函数指定坐标轴显示的范围:plt.axis([xmin,xmax,ymin,ymax])
plt.plot([1,2,3,4],[1,4,9,16],'ro')
plt.axis([0,6,0,20])
plt.show()
之前我们传给plot的参数都是列表,事实上,向plot中传入numpy数组是更常用的做法。
事实上,如果传入的是列表, matplotlib会在内部将它转化成数组再进行处理:
事实上,在上面的例子中,我们不仅仅向plot函数传入了数组,还传入了多组(x, y, format_ str)
参数,它们在同一张图上显示。
这意味着我们不需要使用多个plot函数来画多组数组,只需要可以将这些组合放到一个plot函数中去即可。
t=np.arange(0.,5.,0.2)
plt.plot(t,t,'r--',
t,t**2,'bs',
t,t**3,'g^')
plt.show()
线条属性:linewidth
可以改变线条的宽度,color
可以改变线条颜色
x=np.linspace(-np.pi,np.pi) #生成等差数列
y=np.sin(x)
plt.plot(x,y,linewidth=4.0,color='r') #设置线条宽度为4,颜色为红色
plt.show()
plot函数返回-个Line2D对象组成的列表,每个对象代表输入的一对组合,例如:
linel, line2 = plt. plot(x1, y1, x2, y2)
lines = plt.plot(x1, yl, x2, y2, x3, y3)
我们可以使用这个返回值来对线条属性进行设置:
接收单个返回值进行修改:
line1,line2=plt.plot(x,y,'r-',x,y+1,'g-')
line1.set_antialiased(False) #关闭抗锯齿
plt.show()
line=plt.plot(x,y,'r-',x,y+1,'g-')
line.set_antialiased(False) #关闭抗锯齿
发现报错!
说明可以对单个返回值进行属性设置,但不能对列表进行属性设置
函数解释:
setp(obj, *args, **kwargs)
obj:所要进行操作的对象
*args:可变参数,可传入列表,进行所要进行的操作,如:x = arange(0,1.0,0.01)
**kwargs 关键字参数,接收字典值,进行所要进行的操作,如:linewidth=2
详细可参见:setp函数–Matplotlib
line=plt.plot(x,y)
plt.setp(line,color='r',linewidth=4)
line=plt.plot(x,y)
plt.setp(line,'color','b','linewidth',2) #matlab风格的调用方式
个人理解 :figure()函数可以用来生成画布,各种参数可以定义画布大小,而subplot()可以帮助生成多个画布,帮助我们更好的定位各个画布
figure()函数会产生一个指定编号为num的图:
plt. figure (num)
这里, figure(1)实可以省略的,因为默认情况下plt自动产生一幅图像。
使用subplot可以在一副图中生成多个子图,其参数为:
plt. subplot (numrows, numcols, fi gnum)
当numrows * numcols < 10时,中间的逗号可以省略,因此plt. subplot (211)就相当于plt. subplot(2, 1, 1)。
figure语法说明:
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:是否显示边框
来自:https://blog.csdn.net/m0_37362454/article/details/81511427
subplot(nrows,ncols,sharex,sharey,subplot_kw,**fig_kw)
来自:https://blog.csdn.net/m0_37362454/article/details/81511427
def f(t):
return np.exp(-t)*np.cos(2*np.pi*t)
t1=np.arange(0.0,5.0,0.1)
t2=np.arange(0.0,5.0,0.02)
plt.figure(figsize=(10,6))
plt.subplot(211)
plt.plot(t1,f(t1),'bo',t2,f(t2),'k') #第一幅图
plt.subplot(212)
plt.plot(t2,np.cos(2*np.pi*t2),'r--') #第二幅图
plt.show()
常见函数:
【matplotlib】 图解pyplot figure、subplot、axes、axis的区别
matplotlib常见函数- plt.rcParams、matshow/坐标轴设置
先操作一发忽略警告
这个警告其实没啥大问题,就是看着难受QAQ
import warnings
warnings.filterwarnings('ignore')#忽略警告
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
预处理:
#设置黑体,从而可以显示中文
plt.rcParams['font.sans-serif']=['SimHei']
#设置符号显示
plt.rcParams['axes.unicode_minus']=False
df=pd.read_excel('movie_data3.xlsx')
df[:5]
rcParams函数可参考:https://www.cnblogs.com/douzujun/p/10327963.html
柱状图(bar chart) ,是种以长方形的长度为变量的表达图形的统计报告图,由一系列高度不等的纵向条纹表示数据分布的情况,用来比较两个或以上的价值(不同时间或者不同条件) ,只有一个变量,通常利用于较小的数据集分析。
柱状图亦可横向排列,或用多维方式表达。
函数解释:
bar(left, height, width, color, align, yerr)
left
为x轴的位置序列,一般采用arange函数产生一个序列;
height
为y轴的数值序列,也就是柱形图的高度,一般就是我们需要展示的数据;
width
为柱形图的宽度,一般这是为1即可;color为柱形图填充的颜色;
align
设置plt.xticks()函数中的标签的位置;
yerr
让柱形图的顶端空出一部分。
color
设置柱状的颜色
alpha
设置柱状填充颜色的透明度 大于0 小于等于1
linewidth
设置线条的宽度
来自:matplotlib 直方图 和堆叠直方图 plt.bar()
这个也不错:Matplotlib - 柱状图、直方图、条形图 bar() & barh() 所有用法详解
data=df['产地'].value_counts()
#找到横纵轴
x=data.index
y=data.values
#画10*6的图案
plt.figure(figsize=(10,6))
plt.bar(x,y,color='g')
#定义标题
plt.title('各国家或地区电影数量',fontsize=20)
#对横纵轴进行设定
plt.xlabel('国家或地区',fontsize=18)
plt.ylabel('电影数量',fontsize=18)
#坐标轴字体调整
plt.tick_params(labelsize=14) #设置纵轴字体大小
plt.xticks(rotation=90) #将横轴字旋转90度
#给图形添加数据标签
for a,b in zip(x,y):
plt.text(a,b+10,b,ha='center',va='bottom',fontsize=10) #ha设定对齐方式,va设定垂直对齐方式
#增加网格线
#plt.grid()
plt.show()
曲线图又称折线图,是利用曲线的升、降变化来表示被研究现象发展变化趋势的一种图形。它在分析研究社会经济现象的发展变化、依存关系等方面具有重要作
绘制曲线图时,如果是某一现象的时间指标 应将时间绘在坐标的横轴上指标绘在坐标的纵轴上。如果是两个现象依存关系的显示,可以将表示原因的指标绘在横
轴上,表示结果的指标绘在纵轴上。同时还应注意整个图形的长宽比例。
主要用1888-2015年数据,16年以后数据不完整
data=df['年代'].value_counts()
data=data.sort_index()[:-2] #利用切片将不完整数据清除
data
#横纵轴值
x=data.index
y=data.values
plt.plot(x,y,color='b')
plt.title('每年电影数量',fontsize=20)
plt.ylabel('电影数量',fontsize=18)
plt.xlabel('年份',fontsize=18)
for a,b in zip(x[::10],y[::10]): #间隔十年标记数据
plt.text(a,b+10,b,ha='center',va='bottom',fontsize=10)
#用箭头标记极值点
plt.annotate('2012年达到最大值',xy=(2012,data[2012]),xytext=(2025,2100),arrowprops=dict(facecolor='black',edgecolor='red'))
#设置语句
plt.text(1980,200,'电影数量开始快速增长')
plt.show()
对于这幅图形。我们使用
xlabel
,ylabel
.title
,text
方法设置了文字,其中:
●xlabel : x轴标注
●ylabel : y轴标注
●title :图形标题
●text :在指定位置放入文字
输入特殊符号支持使用Tex语法.用$
隔开。$
除了使用text在指定位置标上文字之外,还可以使用annotate
函数进行注释,annotate
主要有两个参数:
●xy :注释位置
●xytext :注释文字位置
饼图英文学名为Sector Graph,有名Pie Graph。常用于统计学模块。2D饼图为圆形,手画时.常用圆规作图。
仅排列在工作表的一列或一行中的数据可以绘制到饼图中。 饼图显示一个数据系列( 数据系列:在图表中绘制的相关数据点,这些数据源自数据表的行或列。图表中的每个数据系列具有唯一的颜色或图案并且在图表的图例中表示。 可以在图表中绘制一个或多个数据系列。饼图只有一个数据系列。) 中各项的大小与各项总
和的比例。
饼图中的数据点( 数据点:在图表中绘制的单个值,这些值由条形、柱形、折线、饼图或圆环图的扇面、圆点和其他被称为数据标记的图形表示。相同颜色的数据标记组成一个数据系列。) 显示为整个饼图的百分比。
饼图反映占比,适合类别较少的数据分类
def pie(x, explode=None, labels=None, colors=None, autopct=None, pctdistance=0.6, shadow=False, labeldistance=1.1, startangle=None, radius=None, counterclock=True, wedgeprops=None, textprops=None, center=(0, 0), frame=False, rotatelabels=False, hold=None, data=None)
x
:(每一块)的比例,如果sum(x) > 1会使用sum(x)归一化;
labels
:(每一块)饼图外侧显示的说明文字;
explode
:(每一块)离开中心距离;
startangle
:起始绘制角度,默认图是从x轴正方向逆时针画起,如设定=90则从y轴正方向画起;
shadow
:在饼图下面画一个阴影。默认值:False,即不画阴影;
labeldistance
:label标记的绘制位置,相对于半径的比例,默认值为1.1, 如<1则绘制在饼图内侧;
autopct
:控制饼图内百分比设置,可以使用format字符串或者format function%1.1f
指小数点前后位数(没有用空格补齐);
pctdistance
:类似于labeldistance,指定autopct的位置刻度,默认值为0.6;
radius
:控制饼图半径,默认值为1;
counterclock
:指定指针方向;布尔值,可选参数,默认为:True,即逆时针。将值改为False即可改为顺时针。
wedgeprops
:字典类型,可选参数,默认值:None。参数字典传递给wedge对象用来画一个饼图。例如:wedgeprops={‘linewidth’:3}设置wedge线宽为3。
textprops
:设置标签(labels)和比例文字的格式;字典类型,可选参数,默认值为:None。传递给text对象的字典参数。
center
:浮点类型的列表,可选参数,默认值:(0,0)。图标中心位置。
frame
:布尔类型,可选参数,默认值:False。如果是true,绘制带有表的轴框架。
rotatelabels
:布尔类型,可选参数,默认为:False。如果为True,旋转每个label到指定的角度。
返回值:
如果没有设置autopct,返回(patches, texts)
如果设置autopct,返回(patches, texts, autotexts)
来自:https://www.cnblogs.com/biyoulin/p/9565350.html
data=pd.cut(df['时长'],[0,60,90,110,1000]).value_counts()
data
y=data.values
y=y/sum(y) #归一化处理,系统会自动进行,可不写
plt.figure(figsize=(7,7)) #设置饼图大小
plt.title('电影时长占比',fontsize=15)
patches,l_text,p_text=plt.pie(y,labels=data.index,autopct='%.2f %%',colors='bygr',startangle=90)
#通过函数返回值修改文字
for i in p_text:
i.set_size(15)
i.set_color('w')
for i in l_text:
i.set_size(15)
i.set_color('r')
#增加图例
plt.legend()
plt.show()
频率分布直方图(Histogram)又称质量分布图。是一种统计报告图,由系列高度不等的纵向条纹或线段表示数据分布的情况。 一般用横轴表示数据类型,纵轴表示分布情况。
频率分布直方图是数值数据分布的精确图形表示。这是一个连续变量(定量变量)的概率分布的估计,并且被卡尔皮尔逊( Karl Pearson )首先引入。它是一种条形图。
为了构建直图,第一步是将值的范围分段,即将整个值的范围分成一系列间隔 ,然后计算每个间隔中有多少值。这些值通常被指定为连续的.不重叠的变量间隔。间隔必须相邻,并且通常是(但不是必须的)相等的大小。
直方图也可以被归一化以显示相对频率。然后,它显示了属于几个类别中的每个案例的比例,其高度等于1。
matplotlib为我们提供了hist函数,借助hist函数我们可以画出频率分布直方图。
hist的参数非常多.但常用的就这几个.只有第一个是必须的,后面几个可选
arr
:需要计算直方图的一维数组
bins
:直方图的柱数,可选项,默认为10
normed
:否将得到的直方图向量归一化。默认为0
facecolor
:直方图颜色
edgecolor
:直方图边框颜色
alpha
:透明度
histtype
:直方图类型, “bar, ‘barstacked’, ‘step’, 'stepilled”
返回值:
n
:方图向量.是否归- -化由参数normed设定
bins
:返回各个bin的区间范围
patches
:返回每个bin里面包含的数据,是一个list
详细可参见:matplotlib.pyplot.hist函数 参数详解
plt.figure(figsize=(10,6))
plt.hist(df['评分'],bins=20,edgecolor='w',alpha=0.5)
plt.show()
def f(x):
return x**2+2*x+1
x1=np.linspace(-5,3)
y1=f(x1)
plt.plot(x1,y1,color='k')
plt.show()
t1=np.linspace(-np.pi,np.pi)
plt.figure(figsize=(10,6))
plt.subplot(211)
plt.plot(t1,np.sin(t1),'b-') #第一幅图
plt.grid()
plt.subplot(212)
plt.plot(t1,np.cos(t1),'r--') #第二幅图
plt.grid()
plt.show()
plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus']=False
df=pd.read_excel('酒店数据22.xlsx',index_col=0)
df[:5]
data=df['地区'].value_counts()
x=data.index
y=data.values
plt.figure(figsize=(10,6))
plt.bar(x,y,color='r',width=0.5,alpha=0.3,linewidth=1)
plt.title('各个地区酒店数量柱状图',fontsize=20)
plt.ylabel('酒店数量',fontsize=15)
plt.xlabel('地区',fontsize=15)
for a,b in zip(x,y):
plt.text(a,b+2,b,ha='center',va='bottom',fontsize=10)
plt.show()
data=df['价格等级'].value_counts()
x=data.index
y=data.values
plt.figure(figsize=(10,6))
plt.bar(x,y,color='g',width=0.5,alpha=0.3,linewidth=1)
plt.title('各个价格等级数量柱状图',fontsize=20)
plt.ylabel('酒店数量',fontsize=15)
plt.xlabel('价格等级',fontsize=15)
for a,b in zip(x,y):
plt.text(a,b+2,b,ha='center',va='bottom',fontsize=12)
plt.show()
data=df['价格等级'].value_counts()
plt.figure(figsize=(7,7))
plt.title('各个价格等级酒店占比',fontsize=20)
#colors=['lightskyblue','linen','palegreen']
patches,l_text,p_text=plt.pie(y,labels=data.index,autopct='%.2f %%',startangle=90,explode=(0.01,0.01,0.01) )
for i in p_text:
i.set_size(15)
i.set_color('w')
for i in l_text:
i.set_size(15)
i.set_color('r')
plt.legend()
plt.show()
plt.figure(figsize=(10,6))
plt.hist(df['评分'],bins=20,edgecolor='w',alpha=0.5)
plt.title('酒店评分直方图',fontsize=20)
plt.show()
data=df['评分'].groupby(df['热门等级']).mean()
data=data.sort_values()
x=data.index
y=data.values
plt.figure(figsize=(10,6))
plt.bar(x,y,color='r',width=0.5,alpha=0.3,linewidth=1)
plt.title('各个热门等级酒店评分均值柱状图',fontsize=20)
plt.ylabel('酒店数量',fontsize=15)
plt.xlabel('热门等级',fontsize=15)
for a,b in zip(x,y):
plt.text(a,b+0.05,b,ha='center',va='bottom',fontsize=10)
plt.show()