Matplotlib库(一)
matplotlib是python的2D图形包,pyplot封装了很多画图的函数。
导入相关的包:
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
1. 基本绘图函数及相关设置
-
plt.show()函数
默认情况下matplotlib.pyplot不会直接显示图像,只有调用plt.show()函数时才显示
plt.show()默认在新窗口打开一幅图像
-
plt.plot()函数
基本用法:
plt.plot(x,y)
plt.plot([1,2,3,4],[1,4,9,16]) plt.show() ## 输出结果
plt.plot([1,2,3,4]) #绘制线图,y的值必须给定,x的值可以不用指定,默认使用索引0~(N-1)
plt.ylable('y') #设置纵轴名称
plt.xlabel('x') #设置横轴名称
-
字符参数
字符 颜色 字符 颜色 'b' 蓝色 'm' 品红,magenta 'g' 绿色 'y' 黄色 'r' 红色 'k' 黑色 'c' 青色,cyan 'w' 白色 字符 类型 字符 类型 字符 类型 字符 类型 '-' 实线 '--' 虚线 '_' 横线点 '-.' 虚点线 '.' 点 ':' 点线 ',' 像素点 'o' 圆点 'v' 下三角点 '^' 上三角点 '<' 左三角点 '>' 右三角点 '1' 下三叉点 '2' 上三叉点 '3' 左三叉点 '4' 右三叉点 '+' 加号点 'x' 乘号点 'p' 五角点 '*' 星形点 'h' 六边形点1 'H' 六边形点2 'D' 实心菱形点 'd' 瘦菱形点 's' 正方点 plt.plot([1,2,3,4],[1,4,9,16],'ro') #设置为红色圆点 plt.show() ## 输出结果
-
显示范围
plt.axis([xmin,xmax,ymin,ymax])
plt.plot([1,2,3,4],[1,4,9,16],'ro') #设置为红色圆点 plt.axis([0,5,0,20]) plt.show() ## 输出结果
-
传入numpy数组
如果传入的是列表,matplotlib会在内部将列表转化为数组再进行处理。
t = np.arange(0,5,0.2) #生成0到5不包含5的数组,步长为0.2 plt.plot(t,t,'r--',t,t**2,'bs',t,t**3,'g^') #在同一个图中画多条线 plt.show() ## 输出结果
-
除字符串以外,线条属性还可以通过参数设置
x = np.linspace(-np.pi,np.pi) y = np.sin(x) plt.plot(x,y,linewidth = 4,color = 'r') #linewidth设置线宽 plt.show() ## 输出结果
-
使用plt.plot()的返回值设置线条属性
x = np.linspace(-np.pi,np.pi) y = np.sin(x) line1,line2 = plt.plot(x,y,'r-',x,y+1,'g-') line1.set_antialiased(False) #可以直接对line1设置,取消抗锯齿 plt.show() ## 输出结果
-
使用plt.setp()修改线条性质
x = np.linspace(-np.pi,np.pi) y = np.sin(x) line = plt.plot(x,y) plt.setp(line,color = 'g',linewidth = 4) #或者plt.setp(line,'color','g','linewidth',4)
2. 子图
-
figure(num)函数会产生一个指定编号为num的图
-
subplot可以在一幅图中生成多个子图
plt.subplot(numrows,numcols,fignum)
numrows:生成子图的总行数
numcols:生成子图的总列数
fignum:指定某个子图的序号
当
numrows*numcols < 10
时,中间的逗号可以省略 -
例如:
def f(t): return np.exp(-t)*np.cos(2*np.pi*t) t1 = np.arange(0,5,0.1) t2 = np.arange(0,5,0.02) plt.figure(figsize = (10,6)) plt.subplot(211) plt.plot(t1,f(t1),'bo',t2,f(t2),'r') plt.subplot(212) plt.plot(t2,np.cos(2*np.pi*t2),'k--') plt.show() ## 输出结果
3. 电影数据绘图
前期准备:
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
import warnings
warnings.filterwarnings('ignore') #关闭警告提示
plt.rcParams['font.sans-serif'] = ['SimHei'] #图中可以正常显示中文
plt.rcParams['axes.unicode_minus'] = False #图中可以正常显示负号
df = pd.read_excel('movie_data3.xlsx') #读取豆瓣电影数据
df.head() #查看前5行
3.1. 绘制柱状图
要求绘制每个国家的电影数量的柱状图:
data = df['产地'].value_counts() #统计每个国家的电影数量
x = data.index
y = data.values
plt.figure(figsize = (10,6)) #打开一个10*6的画布
plt.bar(x,y,'g') #绘制柱状图
plt.title('各国家电影数量',fontsize = 20) #设置标题,字体大小为20
plt.xlabel('国家',fontsize = 18) #设置横轴标题,字体大小为18
plt.ylabel('电影数量',fontsize = 18) #设置纵轴标题,字体大小为18
plt.tick_params(labelsize = 14) #设置坐标轴上的字体大小为14
plt.xticks(rotation = 90) #设置横轴字体旋转90度
for a,b in zip(x,y):
plt.text(a,b,b,ha = 'center',va = 'bottom',fontsize = 10) #在(a,b)位置处添加文本,添加的是b的值,字体大小为10,ha设置水平居中,va设置垂直方向的位置
plt.show() #展示图
3.2. 绘制曲线图
要求绘制每年上映的电影数量的曲线图:
data = df['年代'].value_counts() #统计每年电影数量
data = data.sort_index() #对索引排序
x = data.index
y = data.values
plt.plot(x,y,'b')
plt.title('每年电影数量',fontsize = 20)
plt.xlabel('年份',fontsize = 18)
plt.ylabel('电影数量',fontsize = 18)
for a,b in zip(x[::10],y[::10]): #间隔十年添加文本
plt.text(a,b+50,b,ha = 'center',va = 'bottom',fontsize = 10)
plt.annotate('2012年达到最大值',xy = (2012,data[2012]),xytext = (2025,2100),arrowprops = dict(facecolor = 'black',edgecolor = 'red')) #xy是箭头尖的位置,xytext是箭头尾的位置,arrowprops设置箭头属性
plt.text(1980,1000,'电影数量开始快速增长')
plt.show()
3.3. 绘制饼图
要求根据电影长度绘制饼图:
plt.pie(x,explode = None,labels = None,colors = None,autopct = None,pctdistance = 0.6,shadow = False,labeldistance = 1.1,startangle = None,radius = None)
参数解释:
x:每一块的比例,如果sum(x)>1,会自动归一化
labels:每一块饼图外侧显示的说明文字
explode:每一块离开中心距离
startangle:开始绘制的角度,默认是从x轴正半轴逆时针画起,若等于90,则从Y轴正半轴开始
shadow:是否阴影
labeldistance:label绘制的位置,相对于半径的比例,如小于1则绘制在饼图内测
autopct:控制饼图内百分比设置
pctdistance:类似于labeldistance,指定autopct的位置
radius:控制饼图半径
data = pd.cut(df['时长'],[0,60,90,110,1000]).value_counts() #将时长离散化为四个区间,并统计每个区间电影个数
y = data.values
plt.figure(figsize = (6,6))
plt.title('电影时长占比',fontsize = 15)
patches,l_text,p_text = plt.pie(y,labels = data.index,autopct = '%.1f %%',colors = 'rcyg') #饼图的返回值分别是matplotlib.patches.Wedge对象序列、外部文字、内部文字,类型都是列表
for i in l_text:
i.set_size(20)
i.set_color('r')
for i in p_text:
i.set_size(15)
i.set_color('w')
plt.legend(loc = 'upper left') #增加图例,位置是左上
plt.show()
3.4. 绘制频率分布直方图
要求绘制电影评分的频率分布直方图:
plt.figure(figsize = (10,6))
plt.hist(df['评分'],bins = 20,edgecolor = 'k',alpha = 0.5) #bins设置直方图的柱子数量,默认是10;edgecolor设置柱子边框颜色;alpha设置透明度;facecolor设置直方图填充颜色;normed设置是否归一化,默认为0
返回值有:
n:直方图向量
bins:各个区间范围
patches:每个bin里面包含的数据,是一个列表
标签:plot,plt,show,Matplotlib,设置,np,data From: https://www.cnblogs.com/DYDNyang/p/17113758.html