先记录小技巧:
pycharm中,鼠标点在一个方法上,ctrl+b,即转到该方法的源码,以找到使用方法。
使用意义:从一堆数据中找到或总结出需要的信息,帮助判断和决策
与web、爬虫、机器学习相结合
基本流程:提出问题->准备数据->分析数据->获得结论->成果可视化等其他操作
一般使用环境:conda(容易解决各种安装问题)
matplotlib用于绘图,可绘制的图形在matplotlib官网上进行查阅获取代码,更改变量即可。
打不开的话就用这个matplolib中文文档
以下笔记均以绘制折线图、散点图、条形图和直方图为例。
matplolib可以将数据可视化,直接用python执行,名字取材于matlab。
(axis轴:坐标轴)
使用一般方法:
以折线图为例:
from matplotlib import pyplot as plt#模块导入
x = X#传递自变量
y = Y#传递应变量
plt.plot(x,y)#导入变量,并通过plot绘制折线图(不展示)
plt.show()#展示图形
此时显示的时一段折线图。
但是matplolib还有更多的设置,如
设置图片大小:
fig= plt.figure(figsize = (a, b), dpi = 80)`#a、b表示宽和高
保存到本地:
plt.savefig('./name.svg')#./代表再当前路径下的文件,可以更改。使用.svg格式是矢量图格式,避免模糊。
描述图像信息
添加描述信息:
plt.xlabel('xlabel')
plt.ylabel('ylabel')
plt.title('title')
调整刻度:(以x轴为例,y轴即把xtick改为ytick)
此处注意:更改刻度的疏密可用此处代码表示:_x = list(x)[shart, stop, step]
#把x转化为列表,方便用[ ::]截取片段
调整图表:
绘制网格:在图像绘制后,加入代码plt.grid()
在调整x轴和y轴刻度时会直接调整网格。一般可以传入如alpha(透明度)等参数。
添加一条新的曲线:
直接再加入一条:plt.plot(x, y)
添加图例
plt.plot(x, y,label='label')
plt.legend(prop='my_font')
#除了legend更改字体使用prop以外,更改字体均使用fontproperties
以下两点待补充
标记特殊点
添加水印
假设要记录cathy和sarah两人11岁至30岁的旅行经历
from matplotlib import pyplot as plt
from matplotlib import font_manager
#my_font = font_manager.FontProperties('C:/Users/MI/AppData/Local/Microsoft/Windows/Fonts/BUSTER Regular.ttf')
my_font = font_manager.FontProperties(fname='C:/Users/MI/AppData/Local/Microsoft/Windows/Fonts/DuntonWriting.ttf')
x = range(11,31)
y = [1, 0, 1, 1, 2, 4, 3, 2, 3, 4, 4, 5, 6, 5, 4, 3, 3, 1, 1, 1]
y2 = [2, 0, 3, 5, 3, 2, 2, 1, 1, 1, 1, 3, 2, 5, 6, 3, 1, 2, 3, 0]
fig = plt.figure(figsize=(20,8),dpi=80)
xtick = []
for i in x:
xtick += f'{i}'
plt.xticks(x, xtick,fontproperties=my_font)
plt.xlabel('age= ',fontproperties=my_font)
plt.ylabel('annual travel-times', fontproperties=my_font)
plt.title('travel-times between the age of 11 and 30',fontproperties=my_font)
plt.plot(x, y, color='cyan', label='Sarah',linewidth=3)#颜色可搜索颜色代码(十六进制)
plt.plot(x, y2, color='orange', label='Cathy')
plt.grid(alpha=0.5)
plt.legend(prop=my_font,loc=0)
plt.savefig('./test3.png')
plt.show()
基本同上,使用plt.scatter进行绘图,直接上案例:
北京3月和10月的气温散点图
from matplotlib import pyplot as plt
from matplotlib import font_manager
my_font = font_manager.FontProperties(fname='C:/Users/MI/AppData/Local/Microsoft/Windows/Fonts/C288-蔡云汉隶书书法字体.TTF')
x1 = range(1, 32)
#排版漂亮,两个图要分离开
x2 = range(51,82)
_x = list(x1) + list(x2)
plt.figure(figsize=(20, 8), dpi=80)
x_tick = []
for i in x1:
x_tick += [f'March :day {i}']
for i in x2:
x_tick += [f'October :day {i-50}']
plt.xticks(_x[::3], x_tick[::3], rotation=45, fontproperties=my_font)
plt.xlabel(f'temperature in March', fontproperties=my_font)
plt.ylabel(f'temperature in October', fontproperties=my_font)
plt.title(f'Temperature of two months in Beijing')
y1 = [11, 17, 16, 11, 12, 11, 12, 6, 6, 7, 8, 9, 12, 15, 14, 17, 18, 21, 16, 17, 20, 14, 15, 15, 15, 19, 21, 22, 22, 22, 23]
y2 = [26, 26, 28, 19, 21, 16, 16, 19, 18, 20,19,20, 21, 22, 13, 5, 13, 17, 10, 11, 17, 13, 13, 24, 12, 11, 13, 12, 13, 5, 6]
plt.scatter(x1, y1, label='March', color='blue')
plt.scatter(x2, y2, label='October',color='orange')
plt.legend(prop=my_font, loc=0)
plt.savefig('temp1.png')
plt.show()
(一般用于数据对比、数量/频率统计等)
2017年票房数据(因为字体这边有点问题,用f(n)表示电影名)
from matplotlib import pyplot as plt
from matplotlib import font_manager
plt.figure(figsize=(15,8),dpi=80)
my_font = font_manager.FontProperties(fname='C:/Windows/Fonts/simhei.ttf')
x=[]
#x = ['f1','速度与激情','功夫瑜伽',"西游降魔篇",'变形金刚5','摔跤吧爸爸','加勒比海盗','金刚','极限特工','生化危机','乘风破浪','生化危机','智取威虎山','大闹天竺','金刚狼','蜘蛛侠','悟空传','银河护卫队','轻声','木乃伊']
for i in range(1,21):
x += [f'f{i}']
y = [56,27,17,16,15,13,11,11,11,11,10,10,8,7,7,7,6,6,6,6]
plt.ylabel(f'booking office')
plt.xlabel('film name')
plt.title('films\' bookong office in 2017')
plt.bar(x, y, color='#BA55D3',width=0.3)
plt.savefig('temp2.png')
plt.show()
但条形图中,通常还会有两种需求:横向条形图、多次条形图,以下给出解决方法及案例
横向条形图:
plt.barh(x,y)
但此时若写plt.barh(x,y,width=3)
代码会出错,核查源码后发现barh()的参数如下:
barh(y, width, height=0.8, left=None, *, align=‘center’, **kwargs)
简单更改后结果如下:
多次条形图的重点在于紧邻的几条数据。
以三天中4部电影的票房对比为例:
from matplotlib import pyplot as plt
from matplotlib import font_manager
my_font = font_manager.FontProperties(fname='C:/Windows/Fonts/simhei.ttf')
_x = ['film1','film2','film3','film4']
#输入4部电影每天的票房
y3=[15746,312,4496,329]
y2=[12357,156,2045,168]
y1=[3458,399,2358,362]
#设置width时候保证其数值小于1/n(n为图中每一大块含有的条形图的数量)
#此处n表现为天数
#否则条形图们就会紧紧挤在一起
bar_width = 0.2
#通过使向右移动一个width的长度,设置紧贴的3列数据
x1 = list(range(len(_x)))
x2 = [i+bar_width for i in x1]
x3 = [j+bar_width for j in x2]
plt.bar(range(len(_x)),y1,width=bar_width,label='day1')
plt.bar(x2,y2,width=bar_width, label='day2')
plt.bar(x3,y3,width=bar_width, label='day3')
plt.xticks(x2,['film1','film2','film3','film4'])
plt.legend(loc=0)
plt.title('booking office of 4 films in 3 days')
plt.ylabel('booking office')
plt.xlabel('films')
plt.savefig('temp4.png')
plt.show()
直方图调用的函数是:
plt.hist(_list, num_bins)
_list代表需要统计的数据
num_bins代表组数(分组数量)
分组方面,一般规定数据在100以内时分5~12组
大于100时,n = 极差/组距,组距即每个小组的间隔
数据差距越大,组距应相应扩大
若组距不确定,可设置bins = list,传入一个数组。
若要改为频率直方图,输入以下代码:
plt.hist(_list,nub_bins,nomed=True)
案例:统计250部电影时长的分布情况
此处案例中由于y是随机产生的,因此不能保证(max(y)-min(y))//d是整数,因此数据条和网格不能重合,现实数据可以避免这个问题。
import random as rd
from matplotlib import pyplot as plt
#设置图形大小
plt.figure(figsize=(20,8),dpi=80)
#假设电影时长
y = []
for i in range(250):
y.append(rd.randint(100,200))
#绘制直方图
d=5#组距
num = max(y)//d
plt.hist(y, num)
#设置x轴刻度
#注意添加步长(组距)
_x = [f'{i}min' for i in range(min(y), max(y)+d, d)]
plt.xticks(range(min(y), max(y)+d, d),_x, rotation=45)
#添加描述信息
plt.xlabel("the lenth of movies")
plt.ylabel('the number of movies')
plt.title('movie-numbers of different lenth')
plt.grid()
plt.show()
plt.savefig('temp5.png')
注意:如果给出的数据是已经统计好的数据,则直接使用条形图来制作直方图,设置width=1(消除条形图之间的空隙),根据情况修改xticks即可。