matplotlib是一个python的2D图形包
plt:matplotlib.pyplot
默认情况下,matplotlib.pyplot不会直接显示图像,只用调用plt.show()函数时,图像才会显示出来
plot.show()默认是在新窗口打开一幅图像,并且提供了对图像进行操作的按钮
plt.plot()函数可以用来绘制线形图
import matplotlib.pyplot as plt
plt.plot([1,2,3,4])
plt.ylabel('y')
plt.xlabel('x')
plt.show()
plt.plot(x,y):指定x和y
plt.plot(y):默认参数,x为0~N-1
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-iU8uc8US-1666790148529)(…/…/…/…/AppData/Roaming/Typora/typora-user-images/image-20221026110729475.png)]
plt.plot([1,2,3,4],[1,4,9,16],'ro')
plt.show()
使用axis函数来指定坐标轴显示的范围
plt.plot([1,2,3,4],[1,4,9,16],'ro')
plt.axis([0,6,0,20])
plt.show()
import numpy as np
import matplotlib.pyplot as plt
t=np.arange(0.,5.,0.2)
plt.plot(t,t,'r--',
t,t**2,'bs',
t,t**3,'g^')
plt.show()
我们不仅可以向plot函数传入数组,还可以传入多组(x,y,format_str)参数,它们可以在同一张图上显示
linewidth:可以改变线条的宽度
color:可以改变线条的颜色
x=np.linspace(-np.pi,np.pi)
y=np.sin(x)
plt.plot(x,y,linewidth=1,color='r')
plt.show()
x=np.linspace(-np.pi,np.pi)
y=np.sin(x)
line=plt.plot(x,y,linewidth=1,color='r')
plt.setp(line,color='g',linewidth=2)
plt.show()
figure()函数会产生一个指定编号为num的图:plt.figure(num)
figure(1)是可以省略的,默认情况下plt会自动产生一幅图像
使用subplot()可以在一幅图中生成多个子图,其参数为:plt.subplot(numrows, numcols, fignum),当numrows*numcols<10时,中间的逗号可以省略,因此plt.subplot(211)就相当于plt.subplot(2,1,1)
def f(t):
return np.exp(-t)*np.cos(2*np.pi*t)
t1=np.arange(0,5.0,0.1)
t2=np.arange(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,f(t2),'r--')
plt.show()
from selenium import webdriver
# 实现无可视化界面的
from selenium.webdriver.firefox.options import Options
# 规避检测
from selenium.webdriver import FirefoxOptions
from selenium.webdriver import FirefoxProfile
import requests
import re
from bs4 import BeautifulSoup
from lxml import etree
import os
import pandas as pd
# 无可视化界面的操作
# firefox_options = Options()
# firefox_options.add_argument("--headless")
# firefox_options.add_argument("--disable-gpu")
# 实现规避检测
options = FirefoxOptions()
profile = FirefoxProfile()
ua = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:105.0) Gecko/20100101 Firefox/105.0'
# profile.set_preference("network.proxy.type", 4) # 自动检测代理设置
profile.set_preference("dom.webdriver.enabled", False) # 设置非driver驱动
profile.set_preference('useAutomationExtension', False) # 关闭自动化提示
profile.update_preferences() # 更新设置
headers = {
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36',
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',
'Accept-Language': 'zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2',
'Accept-Encoding': 'gzip, deflate, br',
'Connection': 'close',
}
driver = webdriver.Firefox(executable_path='./driver/geckodriver.exe', firefox_profile=profile, options=options)
url="https://movie.douban.com/chart"
driver.get(url=url)
soup = BeautifulSoup(driver.page_source, 'html.parser')
tree=etree.HTML(driver.page_source)
movies=tree.xpath('/html/body/div[3]/div[1]/div/div[1]/div/div/table')
titles=[]
actors=[]
rates=[]
participants=[]
for movie in movies:
contents=movie.xpath("./tbody/tr/td[2]/div//text()")
title=re.sub(r'\n\s+','',contents[1])
title=re.sub(r'\n\s+','',title)
title=re.sub(r'/','',title).strip()
actor=contents[5].strip()
rate=contents[-5].strip()
participant=re.sub('人评价','',contents[-3]).strip()
participant=re.findall('\((.*?)\)',participant,re.S)[0]
titles.append(title)
actors.append(actor)
rates.append(rate)
participants.append(participant)
movies_information={
'titles':titles,
'actors':actors,
'rates':rates,
'participants':participants
}
df=pd.DataFrame(movies_information)
df.to_excel('./rate_information.xlsx')
driver.quit()
如果对爬虫不太了解,可以参考以下文章进行学习:
如果对pandas不太了解,可以参考以下文章进行学习:
柱状图(bar chart),是一种以长方形的长度为变量的表达图形的统计报告图,由一系列高度不等的纵向条纹表示数据的分布情况
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('./rate_information.xlsx')
rates=df['rates'].value_counts()
print(rates)
x=rates.index
y=rates.values
print(y)
plt.figure(figsize=(4,5))
# 绘制柱状图
plt.bar(x,y,color='g',width=0.05)
plt.title('评分',fontsize=20)
plt.xlabel('分数',fontsize=18)
plt.ylabel('次数',fontsize=18)
# 调整坐标轴
plt.tick_params(labelsize=15)
# 旋转x轴标签
plt.xticks(rotation=90)
# 在每一个柱子上的文本内容
for a,b in zip(x,y):
# a:x轴的位置
# b:y轴的位置
# b:显示的内容
# ha:水平对齐方式
# va:垂直对齐方式
plt.text(a,b+0.05,b,fontsize=10,ha='center',va='center')
# 网格线
plt.grid()
plt.show()
曲线图是利用曲线的升、降变化来表示被研究对象发展变化的一种趋势
绘制曲线图时,如果是某一现象的时间指标,应将时间绘在坐标的横轴上,指标绘在坐标的纵轴上;如果是两个现象依存关系的展示,可以将表示原因的指标绘在横轴上,表示结果的指标绘在纵轴上
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('./rate_information.xlsx')
rates=df['rates'].value_counts()
print(rates)
x=rates.index
y=rates.values
plt.figure(figsize=(10,6))
# 曲线图/折线图
plt.plot(x,y,color='b')
plt.title('评分',fontsize=20)
plt.xlabel('分数',fontsize=15)
plt.ylabel('次数',fontsize=15)
plt.xticks(rotation=45)
plt.annotate('max',xy=(7.9,2),xytext=(8.0,2),arrowprops=dict(facecolor='black'))
plt.show()
除了使用text在指定位置上标文字之外,还可以使用annotate函数进行注释,annotate主要有两个参数:
仅排列在工作表的一列或一行中的数据可以绘制到饼图中,饼图显示一个数据系列中各项的大小与各项总和的比例
pie(x, explode=None, labels=None, colors=None, shadow=False, labeldistance=1.1, startangle=None, radius=None):
返回值:如果没有设置autopct,返回(patches, texts);如果设置autopct,返回(patches, texts, autotexts)
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('./rate_information.xlsx')
plt.figure(figsize=(10,10))
data=pd.cut(df['rates'],[0,7.0,7.5,7.8,7.9,10]).value_counts()
print(data)
y=data.values
print((y,data.index))
y=y/sum(y)
plt.title('评分占比',fontsize=20)
# text:饼图外部的文字
# p_text:饼图内部的文字
patches,text,p_text=plt.pie(y,labels=data.index,autopct='%.1f%%',colors='bgykr')
plt.legend() # 图例
for i in p_text:
# 字体大小
i.set_size(15)
# 字体颜色
i.set_color('w')
for i in text:
# 字体大小
i.set_size(15)
# 字体颜色
i.set_color('r')
plt.show()
直方图(histogram)又称质量分布图,是一种统计报告图,由一系列高度不等的纵向条纹或线段表示数据分布的情况,一般用横轴表示数据类型,纵轴表示分布情况
hist的参数非常多:
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('./rate_information.xlsx')
plt.figure(figsize=(10,6))
plt.hist(df['rates'],bins=4,edgecolor='k',alpha='0.5')
plt.show()