matplotlib(终章)

今日内容概要

  • matplotlib实际案例演示
  • 各种图形的总结
  • 数据清洗(简单)
  • 数据清洗的案例

今日内容详细

matplotlib实际案例演示

# 2.绘制每年电影上映数量曲线图
首先载入模块
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
# 写入标题可以是中文的配置(以下是windows下的配置方法)
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
# 从EXCEL文件中读取豆瓣电影排行表
ses = pd.read_csv(r'C:\douban_movie.csv')
ses
运行结果:
名字	投票人数	类型	产地	上映时间	时长	年代	评分	首映地点
0	肖申克的救赎	692795.0	剧情/犯罪	美国	1994-09-10 00:00:00	142.0	1994	9.6	多伦多电影节
1	控方证人	42995.0	剧情/悬疑/犯罪	美国	1957-12-17 00:00:00	116.0	1957	9.5	美国
2	美丽人生	327855.0	剧情/喜剧/爱情	意大利	1997-12-20 00:00:00	116.0	1997	9.5	意大利
3	阿甘正传	580897.0	剧情/爱情	美国	1994-06-23 00:00:00	142.0	1994	9.4	洛杉矶首映
4	霸王别姬	478523.0	剧情/爱情/同性	中国大陆	1993-01-01 00:00:00	171.0	1993	9.4	香港
...	...	...	...	...	...	...	...	...	...
38730	神学院 S	46.0	Adult	法国	1905-06-05 00:00:00	58.0	1983	8.6	美国
38731	1935年	57.0	喜剧/歌舞	美国	1935-03-15 00:00:00	98.0	1935	7.6	美国
38732	血溅画屏	95.0	剧情/悬疑/犯罪/武侠/古装	中国大陆	1905-06-08 00:00:00	91.0	1986	7.1	美国
38733	魔窟中的幻想	51.0	惊悚/恐怖/儿童	中国大陆	1905-06-08 00:00:00	78.0	1986	8.0	美国
38734	列宁格勒围困之星火战役 Блокада: Фильм 2: Ленинградский ме...	32.0	剧情/战争	苏联	1905-05-30 00:00:00	97.0	1977	6.6	美国
38735 rows × 9 columns
安装年代分组 提供两种方法
1.方式1:推荐
ses.groupby(['年代']).size().sort_values(ascending=False)
运行结果:
年代
2012     2042
2013     2001
2008     1963
2014     1887
2010     1886
         ... 
1899        2
34943       1
1892        1
1890        1
39180       1
Length: 128, dtype: int64
2.方式2
ses['年代'].value_counts()
运行结果:
2012     2042
2013     2001
2008     1963
2014     1887
2010     1886
         ... 
1888        2
1890        1
34943       1
1892        1
39180       1
Name: 年代, Length: 128, dtype: int64
            
# 这里我们不应该按照电影数量排序而是应该按照数量对应的年份排序
ses1 = ses.groupby(['年代']).size().sort_index(ascending=False) # ascending参数如果不手动设置为False的话,是升序排序
运行结果:
年代
39180       1
34943       1
2016      257
2015     1592
2014     1887
         ... 
1895        8
1894        3
1892        1
1890        1
1888        2
Length: 128, dtype: int64
  
ses1= ses.groupby(['年代']).size().sort_index(ascending=True) 
ses1
# ascending参数可以选择为True或者可以为空,结果都是一样的
运行结果:
年代
1888        2
1890        1
1892        1
1894        3
1895        8
         ... 
2014     1887
2015     1592
2016      257
34943       1
39180       1
Length: 128, dtype: int64

# 切除异常数据(该表的34943年和39180年的数据)
ses= ses1[:-2]
ses
运行结果: # 这样就将该表的异常数据就切除了
年代
1888       2
1890       1
1892       1
1894       3
1895       8
        ... 
2012    2042
2013    2001
2014    1887
2015    1592
2016     257
Length: 126, dtype: int64
        
  # 确定x轴数值和y轴数值
x = ses.index
x
y = ses.values
y
运行结果:
x:Int64Index([1888, 1890, 1892, 1894, 1895, 1896, 1897, 1898, 1899, 1900,
            ...
            2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016],
           dtype='int64', name='年代', length=126)
y:array([   2,    1,    1,    3,    8,    8,    3,    2,    2,    7,    4,
          6,   16,    8,    5,    7,    5,    6,    5,    5,    4,    5,
          8,   26,   20,   12,   12,   12,   20,   14,   22,   22,   18,
         28,   25,   23,   29,   40,   35,   25,   42,   37,   50,   51,
         46,   60,   50,   38,   49,   39,   47,   53,   57,   54,   49,
         59,   75,   87,   89,   76,   79,   87,   88,  102,  115,  147,
        107,  122,  128,  131,  102,  143,  143,  182,  163,  180,  176,
        172,  207,  190,  219,  207,  213,  223,  196,  233,  220,  201,
        227,  224,  274,  266,  277,  294,  322,  325,  343,  391,  393,
        393,  410,  435,  441,  494,  489,  517,  537,  577,  625,  731,
        828,  900,  951, 1136, 1263, 1515, 1711, 1963, 1862, 1886, 1866,
       2042, 2001, 1887, 1592,  257], dtype=int64)

# 画出曲线图
plt.plot(x,y)
plt.show()

# 最后做优化完善填充信息
plt.figure(figsize=(10,6))
plt.title('年代与电影数量曲线图',fontsize=30,color='c')
plt.xlabel('年代',fontsize=25,color='m')
plt.ylabel('数量',fontsize=25,color='b')
plt.xticks(fontsize=13,color='m')
plt.yticks(fontsize=13,color='b')
# 根据电影的长度绘制饼图
bes.head(2)  # 电影的时长根据具体的业务逻辑划分成不同的等级
bes =  res['时长']
bes
运行结果:
0        142.0
1        116.0
2        116.0
3        142.0
4        171.0
         ...  
38730     58.0
38731     98.0
38732     91.0
38733     78.0
38734     97.0
Name: 时长, Length: 38735, dtype: float64

bes1 = pd.cut(bes,[0,60,70,90,120,140,1100])
# pd.cut(第一个参数带操作对象,自己放一个列表里面指定范围多个区间值)
bes1
运行结果:
0        (140, 1100] # (140,1000] 小括号表示开区间 不包括 中括号表示闭区间 包括
1          (90, 120]
2          (90, 120]
3        (140, 1100]
4        (140, 1100]
            ...     
38730        (0, 60]
38731      (90, 120]
38732      (90, 120]
38733       (70, 90]
38734      (90, 120]
Name: 时长, Length: 38735, dtype: category
Categories (6, interval[int64]): [(0, 60] < (60, 70] < (70, 90] < (90, 120] < (120, 140] < (140, 1100]]

# 统计每个区间的电影数量                                                                           
                                                                             bes2 = bes1.value_counts()  # 对生成的区间做统计计数
bes2             
运行结果:
                                                                               (90, 120]      16578
(0, 60]        10324
(70, 90]        7213
(120, 140]      2718
(140, 1100]     1386
(60, 70]         514
Name: 时长, dtype: int64

# 明确x和y轴数据 画图的时候并不是只有坐标系才需要x轴和y轴
 x = bes2.index
y = bes2.values
# 先粗略的画出来看看
# 图形优化
 plt.title('电影时长分布',fontsize=25,color='purple')
# 饼状图pie会有一个返回值 在早期的版本里面是三个元素 现在只有两个元素
 l_text,p_text = plt.pie(y,labels=x)  # 利用python解压复制的操作
# l_text和p_text都是列表 前者用于修改x轴标题 后者用于修改区域文字
 for i in l_text:
    # i 对应就是各个区域
    # i.set_color('yellowgreen')
     pass
for j in p_text:
    # j 对应就是各个文本
    # j.set_color('sage') # 设置文本颜色
    # j.set_text('hahaha') # 设置文本内容
  j.set_size(15) # 设置文本大小
plt.show()    

各种图形的总结

plot   折线图
pie    饼图
bar    统计图

# DataFrame数组图
cf = pd.DataFrame({
    'Jan':pd.Series([1,2,3],index=['a','b','c']),
    'Fed':pd.Series([4,5,6],index=['b','a','c']),
    'Mar':pd.Series([7,8,9],index=['b','a','c']),
    'Apr':pd.Series([2,4,6],index=['b','a','c'])
})
cf.plot.bar() # 水平柱状图,将每一行中的值分组到并排的柱子中的一组
cf.plot.barh(stacked=True,alpha=0.5) # 横向柱状图,将每一行的值堆积到一起
 

总结

后续更加复杂的图形化展示可以使用
highcharts
      中规中矩
echarts
      echarts是基于highchairts开发的,有点过于花里胡哨
为了舒适的结果,眼前的坎坷路程即使再长都是值得的。
原文地址:https://www.cnblogs.com/abudrSatan1998/p/13640050.html