python数据分析之matplotlib(一)

Matplotlib入门

1、Matplotlib基础

matplotlib是一个python的2D图形包

plt:matplotlib.pyplot

plt.show()函数

默认情况下,matplotlib.pyplot不会直接显示图像,只用调用plt.show()函数时,图像才会显示出来

plot.show()默认是在新窗口打开一幅图像,并且提供了对图像进行操作的按钮

plt.plot()函数

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()

传入Numpy数组

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()

plt.setp()修改线条性质

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()

2、电影数据绘图

使用爬虫爬取电影数据

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()

如果对爬虫不太了解,可以参考以下文章进行学习:

  1. python爬虫基础(一)
  2. python爬虫基础(二)

如果对pandas不太了解,可以参考以下文章进行学习:

  1. python数据分析之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()

曲线图分析

曲线图是利用曲线的升、降变化来表示被研究对象发展变化的一种趋势

绘制曲线图时,如果是某一现象的时间指标,应将时间绘在坐标的横轴上,指标绘在坐标的纵轴上;如果是两个现象依存关系的展示,可以将表示原因的指标绘在横轴上,表示结果的指标绘在纵轴上

  • xlabel:x轴标注
  • ylabel:y轴标注
  • title:图形标题
  • text:在指定位置放入文字
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主要有两个参数:

  1. xy:注释位置
  2. xytext:注释文字位置

饼图分析

仅排列在工作表的一列或一行中的数据可以绘制到饼图中,饼图显示一个数据系列中各项的大小与各项总和的比例

pie(x, explode=None, labels=None, colors=None, shadow=False, labeldistance=1.1, startangle=None, radius=None):

  1. x:(每一块)的比例,如果sum(x)>1会进行归一化处理
  2. explode:(每一块)离开中心的距离
  3. shadow:是否阴影
  4. labeldistance:label绘制位置,相对于半径的比例,如<1则绘制在饼图内侧
  5. radius:控制饼图半径
  6. autopct:控制饼图百分比的设置,可以使用format字符串

返回值:如果没有设置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的参数非常多:

  1. arr:需要计算直方图的一维数组
  2. bins:直方图的柱数,默认为10
  3. normed:是否将得到的直方图向量归一化,默认为0
  4. facecolor:直方图颜色
  5. edgecolor:直方图边框颜色
  6. alpha:透明度
  7. histtype:直方图类型,‘bar’,‘barstacked’,‘step’
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()

你可能感兴趣的:(python,数据分析,python,matplotlib,数据分析)