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开发的,有点过于花里胡哨
为了舒适的结果,眼前的坎坷路程即使再长都是值得的。