目录
1.2 设置坐标轴范围:plt.axis([xmin,xmax,ymin,ymax])
8.1 相关系数矩阵图:pd.plotting.scatter_matrix()
8.2 seaborn库画热力图:sns.heatmap()
- import matplotlib.pyplot as plt #导入相关的包
- import numpy as np
- import pandas as pd
-
- plt.plot([1,2,3,4])# 若只给入一个列表则会被当成y值,x值为0,1,2,3
- plt.ylabel('y') # x轴的名字
- plt.xlabel('x') # y轴的名字
- plt.plot([1,2,3,4],[1,4,9,16]) # 若传入两个列表则第一个为x,第二个列表为y
- # 默认情况下,matplotlib.pyplot 不会直接显示图像,只有调⽤ plt.show()函数时,图像才会显示出来
- plt.show()
还可以指定折线的类型和颜色:
以折现颜色为蓝色,类型为圆点为例:
- plt.plot([1,2,3,4],[1,4,9,16],'bo') #'b'蓝色 'o'圆点
- plt.show()
- plt.plot([1,2,3,4],[1,4,9,16],'g*')
- plt.axis([0,6,0,20]) # 设置坐标轴范围,x轴0-6,y轴0-20
- plt.show()
- t=np.arange(0,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=1.0,color='r') # 通过关键字指定线条宽度,颜色
- plt.show()
- line1,line2=plt.plot(x,y,'r-',x,y+1,'g-')#返回给两个变量,若前面是一个变量,将会给这个变量返回一个列表,而我们无法对列表进行操作
- line1.set_antialiased(False)#对line1去掉抗锯齿
- plt.show()
- line=plt.plot(x,y)
- plt.setp(line,color='g',linewidth=4)
- import warnings
- warnings.filterwarnings('ignore')#对警告进行忽略
- import matplotlib.pyplot as plt
- import numpy as np
- import pandas as pd
- plt.rcParams['font.sans-serif']=['SimHei']#字体设置为黑体,若不设置将无法显示中文
- plt.rcParams['axes.unicode_minus']=False #可以显示负号
-
- df=pd.read_excel('movie_data3.xlsx')
- data=df['年代'].value_counts()
- data=data.sort_index()[:-3] # 对index排序
- data # 查看数据
-
- x=data.index
- y=data.values
-
- plt.plot(x,y,color='b')
-
- plt.title('每年的电影数量',fontsize=20) # 添加图像标题并设置标题大小
- plt.xlabel('年代',fontsize=18) # 添加x轴标题
- plt.ylabel('电影数量',fontsize=18)
-
- plt.show()
1888 2 1890 1 1892 1 1894 3 1895 8 ... 2011 1845 2012 2018 2013 1977 2014 1867 2015 1569 Name: 年代, Length: 125, dtype: int64
对特殊点做标记:
- x=data.index
- y=data.values
-
- plt.figure(figsize=(10,6))
- plt.plot(x,y,color='b')
-
- plt.title('每年的电影数量',fontsize=20)
- plt.xlabel('年代',fontsize=18)
- plt.ylabel('电影数量',fontsize=18)
-
- #每隔十年显示数字,初始值为1888
- for a,b in zip(x[::10],y[::10]):
- plt.text(a,b+10,b,ha='center',va='bottom',fontsize=12)
-
- #标记特殊点
- plt.annotate('2012年达到最大值',xy=(2012,data[2012]),xytext=(2022,2100),arrowprops=dict(facecolor='black',edgecolor='red'))
- # '2012年达到最大值':要填充的文本 ,xy=(2012,data[2012]):要标记的坐标点(箭头尖端的位置) xytext=(2025,2100):箭头末端的位置
- # arrowprops=dict(facecolor='black',edgecolor='red'):箭头的填充色和边框的颜色
- plt.text(1980,1000,'电影数量开始快速增长')# 在指定位置放入文字,在坐标(1980,1000,)写电影数量开始快速增长
- plt.show()
plt.figure(figsize = (x,y)):生成x*y的图像
plt.subplot(x,y,z):生成x行y列的图像,将该图形放置在第z个图像上
- 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,4)) # 生成10*4的图像
- plt.subplot(2,1,1) # 生成两行一列的子图,将第一个图形放在第一个图像上
- plt.plot(t1,f(t1),'bo',t2,f(t2),'k') # 绘制第一个图形
-
- plt.subplot(2,1,2) # 将第二个图形放在第二个图像上
- plt.plot(t2,np.cos(2*np.pi*t2),'r--') # 绘制第二个图形
- 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,4)) # 生成10*4的图像
- plt.subplot(2,2,1) # 生成两行一列的子图,将第一个图形放在第一个图像上
- plt.plot(t1,f(t1),'bo',t2,f(t2),'k') # 绘制第一个图形
-
- plt.subplot(2,2,2) # 将第二个图形放在第二个图像上
- plt.plot(t2,np.cos(2*np.pi*t2),'r--') # 绘制第二个图形
-
- plt.subplot(2,2,3) # 将第三个图形放在第三个图像上
- plt.plot(t1,f(t1),'bo',t2,f(t2),'k') # 绘制第三个图形
-
- plt.subplot(2,2,4) # 将第四个图形放在第四个图像上
- plt.plot(t2,np.cos(2*np.pi*t2),'r--') # 绘制第四个图形
以绘制各个国家的电影数量的柱状图为例:
首先导入数据:
- import warnings
- warnings.filterwarnings('ignore')#对警告进行忽略
- import matplotlib.pyplot as plt
- import numpy as np
- import pandas as pd
- plt.rcParams['font.sans-serif']=['SimHei']#字体设置为黑体,若不设置将无法显示中文
- plt.rcParams['axes.unicode_minus']=False #可以显示负号
-
- df=pd.read_excel('movie_data3.xlsx') # 导入数据集
-
- df[:5]看前五行的数据情况
然后取出要绘制成柱状图的数据:
- data=df['产地'].value_counts()
- data
接着绘制图形
- x=data.index
- y=data.values
-
- plt.figure(figsize=(15,6)) # 图像大小为15*6
- plt.bar(x,y,color='g')
- plt.show()
完整代码为:
- import warnings
- warnings.filterwarnings('ignore')#对警告进行忽略
- import matplotlib.pyplot as plt
- import numpy as np
- import pandas as pd
- plt.rcParams['font.sans-serif']=['SimHei']#字体设置为黑体,若不设置将无法显示中文
- plt.rcParams['axes.unicode_minus']=False #可以显示负号
-
- df=pd.read_excel('movie_data3.xlsx') # 导入数据集
-
- df[:5] # 查看数据集的前五行
- data=df['产地'].value_counts() # 提取出需要的数据
- data # 查看提取出的数据
-
- # 绘制柱状图
- x=data.index
- y=data.values
- plt.figure(figsize=(15,6))
- plt.bar(x,y,color='g')
- plt.show()
- x=data.index
- y=data.values
-
- plt.figure(figsize=(20,6))
- plt.bar(x,y,color='g')
- #加入标题
- plt.title('各个国家或地区电影数量',fontsize=20)# fontsize:图表标题字体大小设置
- plt.xlabel('国家或地区',fontsize=18)# 坐标轴标题字体大小设置
- plt.ylabel('电影数量',fontsize=18)
-
- plt.tick_params(labelsize=14) # 设置y轴字体大小
- plt.xticks(rotation=90) # 将x轴字体旋转90°
-
- # 'edge':将数据标签放在柱子的顶端; 'center':将数据标签放在柱子的中间
- plt.bar_label(p,label_type = 'edge')
-
- # 将数据标签放在柱子的中间也可如下操作:
- # for a,b in zip(x,y):
- # plt.text(a,b+10,b,ha='center',va='bottom',fontsize=10)
- # #a,b+10为要放置的位置,b为要放置的数字,center为将数字居中,bottom是将数字放在柱子的顶端
-
- plt.show()
根据电影的时长绘制柱状图
- import warnings
- warnings.filterwarnings('ignore')#对警告进行忽略
- import matplotlib.pyplot as plt
- import numpy as np
- import pandas as pd
- plt.rcParams['font.sans-serif']=['SimHei']#字体设置为黑体,若不设置将无法显示中文
- plt.rcParams['axes.unicode_minus']=False #可以显示负号
-
- df=pd.read_excel('movie_data3.xlsx')
-
- # 因为这里的数据是连续的,需要对其作离散处理
- data=pd.cut(df['时长'],[0,60,90,110,1000]).value_counts()#区间为0-60,60-90.....(做开右闭)
- data
-
- y=data.values #饼图会自动进行归一化
-
- plt.figure(figsize=(3,3))
- plt.title('电影时长占比',fontsize=15)
-
- plt.pie(y,labels=data.index,colors='bygr',autopct='%.2f%%')#labels:每个区间的名字 autopct:添加保留两位小数的标签
- plt.show()
添加图例,设置从y轴正向开始
- y=data.values
- y=y/sum(y)
-
- plt.figure(figsize=(3,3))
- plt.title('电影时长占比',fontsize=15)
-
- plt.pie(y,labels=data.index,colors='bygr',autopct='%.1f%%',startangle=90)#startangle设置是从y轴正向开始
- plt.legend()# 绘制图例
- plt.show()
设置饼图外部字体颜色和内部颜色字体:
- y=data.values
- #饼图会自动进行归一化
- #y=y/sum(y)
-
- plt.figure(figsize=(6,6))
- plt.title('电影时长占比',fontsize=15)
-
- patches,l_text,p_text=plt.pie(y,labels=data.index,colors='bygr',autopct='%.1f%%',startangle=90)
- # l_text,p_text:饼图外部字体颜色和饼图内部颜色字体设置
- for i in p_text:
- i.set_size(15)#内部字体15号字体
- i.set_color('w')#白色
- for i in l_text:
- i.set_size(15)
- i.set_color('r')
-
- plt.legend()
- plt.show()
根据电影评分绘制频率分布直方图
-
- import warnings
- warnings.filterwarnings('ignore')#对警告进行忽略
- import matplotlib.pyplot as plt
- import numpy as np
- import pandas as pd
- plt.rcParams['font.sans-serif']=['SimHei']#字体设置为黑体,若不设置将无法显示中文
- plt.rcParams['axes.unicode_minus']=False #可以显示负号
-
- df=pd.read_excel('movie_data3.xlsx') # 导入数据
-
- plt.figure(figsize=(10,6)) 设置图像比例
- plt.hist(df['评分'],bins=20)
- plt.show()
- plt.figure(figsize=(10,6))
- plt.hist(df['评分'],bins=20,edgecolor='black',alpha=0.5)
- plt.show()
绘制电影评分的双轴图
- import numpy as np
- import pandas as pd
- import matplotlib.pyplot as plt
- import matplotlib.mlab as mlab
- from scipy.stats import norm
- import warnings
- warnings.filterwarnings('ignore')#不报警告
- plt.rcParams['font.sans-serif']=['SimHei']#设置字体为黑体
- plt.rcParams['axes.unicode_minus']=False#设置负号能够正常显示
-
-
- df=pd.read_excel('movie_data3.xlsx')
-
- fig=plt.figure(figsize=(5,4))
- ax1=fig.add_subplot(111) #一行一列第一个图
- n,bins,patches=ax1.hist(df['评分'],bins=100,color='m')
-
- ax1.set_ylabel('电影数量',fontsize=15)
- ax1.set_xlabel('评分',fontsize=15)
- ax1.set_title('频率分布直方图',fontsize=20)
-
- y=norm.pdf(bins,df['评分'].mean(),df['评分'].std())
- ax2=ax1.twinx()
- ax2.plot(bins,y,'b--')
- ax2.set_ylabel('概率分布',fontsize=15)
- plt.show()
绘制电影时长和评分的散点图:
- import warnings
- warnings.filterwarnings('ignore')#对警告进行忽略
- import matplotlib.pyplot as plt
- import numpy as np
- import pandas as pd
- plt.rcParams['font.sans-serif']=['SimHei']#字体设置为黑体,若不设置将无法显示中文
- plt.rcParams['axes.unicode_minus']=False #可以显示负号
-
- df=pd.read_excel('movie_data3.xlsx')
- x=df['时长']
- y=df['评分']
-
- plt.figure(figsize=(10,8))
- plt.scatter(x,y) # 散点图绘制函数
- plt.legend() # 图例
- plt.title('电影时长与评分散点图',fontsize=20)
- plt.xlabel('时长',fontsize=18) # x轴标题
- plt.ylabel('评分',fontsize=18)
- plt.show()
选择原有数据的百分之一进行绘图:
- #选择原有数据的百分之一
- x=df['时长'][::100]
- y=df['评分'][::100]
-
- plt.figure(figsize=(10,6))
- plt.scatter(x,y,color = 'c',marker = 'd')
- plt.title('电影时长与评分散点图',fontsize=20)
- plt.xlabel('时长',fontsize=18)
- plt.ylabel('评分',fontsize=18)
- plt.show()
绘制美国电影评分的箱线图:
- import numpy as np
- import pandas as pd
- import matplotlib.pyplot as plt
- import warnings
- warnings.filterwarnings('ignore')#不报警告
- plt.rcParams['font.sans-serif']=['SimHei']#设置字体为黑体
- plt.rcParams['axes.unicode_minus']=False#设置负号能够正常显示
-
- df=pd.read_excel('movie_data3.xlsx')
- data=df[df.产地=='美国']['评分'] # 产地为美国的电影评分数据
-
- plt.figure(figsize=(5,4))
- plt.boxplot(data,whis=2)
- plt.title('美国电影评分',fontsize=15)
- plt.show()
- data=df[df.产地=='美国']['评分']
-
- plt.figure(figsize=(5,3))
- plt.boxplot(data,whis=2,flierprops={'marker':'o','markerfacecolor':'r','color':'k'}
- ,patch_artist = True,boxprops = {'color':'b','facecolor':'#9999ff'})
- #flierprops:设置异常值的形状为圆圈,填充色为红色,边框为黑色
- #patch_artist = true表示可以对箱体的颜色进行修改 boxprops:color修改箱体边框颜色,facecolor修改箱体颜色
- plt.title('美国电影评分',fontsize=20)
- plt.grid() # 设置网格线
- plt.show()
- data1=df[df.产地=='中国大陆']['评分']
- data2=df[df.产地=='中国香港']['评分']
- data3=df[df.产地=='日本']['评分']
- data4=df[df.产地=='英国']['评分']
- data5=df[df.产地=='法国']['评分']
-
- plt.figure(figsize=(8,5))
- plt.boxplot([data1,data2,data3,data4,data5],labels=['中国大陆','中国香港','日本','英国','法国'],whis=2,vert=False) # vert:旋转图形
- plt.title('电影评分箱线图',fontsize=20)
-
- ax = plt.gca()
- ax.patch.set_facecolor('gray') # 背景色调为灰色
- ax.patch.set_alpha(0.3) # 调整背景透明度
-
- plt.grid() # 设置网格线
- plt.show()
① 主对角线为核密度估计的情况:diagonal='kde'
- import warnings
- warnings.filterwarnings('ignore')#对警告进行忽略
- import matplotlib.pyplot as plt
- import numpy as np
- import pandas as pd
- plt.rcParams['font.sans-serif']=['SimHei']#字体设置为黑体,若不设置将无法显示中文
- plt.rcParams['axes.unicode_minus']=False #可以显示负号
-
- df=pd.read_excel('movie_data3.xlsx')
- data=df[['投票人数','评分','时长']]
- data[:5] # 查看前五行
-
- result=pd.plotting.scatter_matrix(data,diagonal='kde',color='k',alpha=0.3,figsize=(10,10))# diagonal='kde':主对角线为核密度估计
① 主对角线为直方图的情况:diagonal='hist'
result=pd.plotting.scatter_matrix(data[::100],diagonal='hist',color='k',alpha=0.3,figsize=(10,10)) # 主对角线为直方图
- import seaborn as sns
-
- corr=data.corr()
- corr=abs(corr) #求绝对值,让后续绘制的图不存在正负相关
-
- fig=plt.figure(figsize=(5,4))
- ax=fig.add_subplot()
-
- ax=sns.heatmap(corr,vmax=1,vmin=0,annot=True)#vmax,vmin设置热力图范围 annot=True:显示每个格子上的参数
-
- plt.xticks(fontsize=15)
- plt.yticks(fontsize=15)
-
- plt.show()