本篇主要内容来自于唐宇迪-机器学习课程的数据可视化章节,此文只做个人实操和理解用。
#折线图的绘制
# -*- coding: utf-8 -*-
import pandas as pd
#首先还是照例导入文件
unrate = pd.read_csv(r'/Users/herenyi/Desktop/UNRATE.csv',encoding = 'UTF-8')
#我们看看该表的前十位数据,这是一个美国政府统计的48年一月以来的每月美国社会失业率。
unrate.head(10)
DATE VALUE
0 1948-01-01 3.4
1 1948-02-01 3.8
2 1948-03-01 4.0
3 1948-04-01 3.9
4 1948-05-01 3.5
5 1948-06-01 3.6
6 1948-07-01 3.6
7 1948-08-01 3.9
8 1948-09-01 3.8
9 1948-10-01 3.7
#由于DATA列不是日期类型,我们先抓换成日期类型
unrate['DATE'] = pd.to_datetime(unrate['DATE'])
import matpplotlib.pyolot as plt # 导入画图库
first_year = unrate[0:12] #先切片第一年的数据
plt.plot(first_year['DATE'], first_year ['VALUE'])
plt.show() #在ipython环境下你需要加入这段代码才能看见图片
如图所示,X轴刻度标签混杂在一起非常不美观。我们需要做如下修改,随便加上各种标题使其完整。
plt.plot( first_year['DATE'], first_year ['VALUE'])
plt.xticks(rotation = 45) #X轴刻度标签,rotation代表旋转角度,我们旋转45度。
plt.xlabel('Month') # X轴标题
plt.ylabel('Unemployment Rate') #Y轴标题
plt.title('Monthly Unemployment Trends, 1948') #图表表图
这就是最基本的折线图的绘制,后续我们再挑战更高难度的图表,此次所用的数据在此网盘里:链接: https://pan.baidu.com/s/1mQOW-woQ2IBrdFP1zPxFQg 提取码: ipks。
子图操作
有时候我们需要在一张图表里插入多项子图来表达同一个数据,这时候就需要子图操作。
# -*- coding: utf-8 -*-
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
fig = plt.figure() #首先先创建个空白图形变量
ax1 = fig.add_subplot(2,2,1) #往这个空白图形变量添加子图,参数中的(2,2,1)分别代表
这是一个2*2的图形矩阵,尾数1表示是第一张图。
这就是输出上文代码后的结果,只有第一张已建立的ax1显示在图表上,其余留白。
ax2 = fig.add_subplot(2,2,2) #我们再在2号位置上加个图表
ax1.plot(np.random.randint(1,5,5), np.arange(5)) #在表一绘制随机点,大家还记得randint函数吗?前面两位1,5表示从大于等于1到小于五区间,尾数5表示任意取五个点
ax2.plot(np.arange(10)*3, np.arange(10))
接下来我们学习在一张图表里插入多条数据,还是原来那张图
ax3 = fig.add_subplot(2,2,3)
# 从之前的数据提取月份数据,创建新列
unrate = pd.read_csv(r'/Users/herenyi/Desktop/UNRATE.csv',encoding = 'UTF-8')
unrate['DATE'] = pd.to_datetime(unrate['DATE'])
unrate['Month'] = unrate['DATE'].dt.month
#再ax3绘制前两年的的每月分失业率折线图
ax3.plot(unrate[0:12]['Month'], unrate[0:12]['VALUE'], c = 'red')
ax3.plot(unrate[12:24]['Month'], unrate[12:24]['VALUE'], c = 'blue')
这样的话我们只能输出两年的美国失业率,为了输出更多的折线,我们考虑用for循环语句去绘制更多的折线。
fig = plt.figure(figuresize = (10, 6)
colors = ['red', 'blue', 'green', 'orange', 'black'] #颜色库
# ax3.plot(unrate[12:24]['Month'], unrate[12:24]['VALUE'], c = 'blue'),这是我们上面的一条折线的输出,我们要循环输出就要观察所需要变化的位置,主要就是颜色和行切片那。所以:
for i in range(5):
start_index = 12*i
end_index = 12 + 12*i
plt.plot(unrate[start_index:end_index]['Month'],
unrate[start_index:end_index]['VALUE'], c = colors[i])
自己附加作业:这里我们就得到了我们想要的多条折线图表,可是我们需要更多的折线怎么办,总不能一个个颜色往颜色库里填吧。想到之前颜色还可以用rgb表示,colors(x, y, z), 也就是说只要有三个随机参数我们就可以随机我们的颜色。那就动手去做吧,原先的架构不变,就是颜色库那进行改造。
import random #主要就是运用下random这个函数
fig = plt.figure(figuresize = (10, 6) #建立一个新的图表
for i in range(10): #要绘制多少条折线,参数就在这里调
x = random.uniform(0,1)
y = random.uniform(0,1)
z = random.uniform(0,1) #每循环一次就可以生成新的颜色参数,达到我们有多少次循环就有多少次颜色目的
start_index = 12*i
end_index = 12 + 12*i
plt.plot(unrate[start_index:end_index]['Month'],
unrate[start_index:end_index]['VALUE'], color = (x,y,z))
貌似颜色区分不怎么明显,哈哈,算了就当自己一个失败的尝试吧,主要对三原色的参数代表颜色的明亮程度还不怎么清楚,应该把random区间定位在亮色区比较好。接下来我们就进行修尾工作了,加入图例,轴标签标题之类的。
fig = plt.figure(figuresize = (10, 6)
for i in range(10):
x = random.uniform(0,1)
y = random.uniform(0,1)
z = random.uniform(0,1)
start_index = 12*i
end_index = 12 + 12*i
label = str(1948 + i) #加入标签,数据从1948年开始,不添加的话则会以列名为标签名
plt.plot(unrate[start_index:end_index]['Month'],
unrate[start_index:end_index]['VALUE'], color = (x,y,z), label = label)
plt.legend(loc = 'best') #加入图例,位置让python自动帮我们选择图表中留白部分,当然你也可以自己选定位置,具体参考文档help(plt.legend)
还是有点丑滴。最后放上自己实战的源代码和最后效果,作为本篇终结。
# -*- coding: utf-8 -*-
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import random
unrate = pd.read_csv(r'/Users/herenyi/Desktop/UNRATE.csv')
unrate['DATE'] = pd.to_datetime(unrate['DATE'])
unrate['Month'] = unrate['DATE'].dt.month
fig = plt.figure(figsize = (10, 6))
for i in range(10):
x = random.uniform(0,1)
y = random.uniform(0,1)
z = random.uniform(0,1)
start_index = 12*i
end_index = 12 + 12*i
label = str(1948 + i)
plt.plot(unrate[start_index:end_index]['Month'],
unrate[start_index:end_index]['VALUE'], color = (x,y,z),label =label)
plt.legend(loc = 'best')
plt.xlabel('Month, Integer')
plt.ylabel('Unemployment Rate, Percent')
plt.title('Monthly Unemployment Trends, 1948-1957')