Matplotlib(基于python)
plotly:可视化工具中的github,相比于matplotlib更加简单,图形更加漂亮,同时兼容matplotlib和pandas
1.基本要点
1.导入matplolib
from matplotlib import pyplot as plt
2.绘制出折线图
- 数据在x轴和y轴的位置,是可迭代对象
- 将x,y值传入plt.plot(),绘制出折线图
- 只传入一个对象,默认是y,x从0到n-1
- 通过plt.show()将绘制的图形展现出来
from matplotlib import pyplot as plt
x=range(2,26,2)
y=[15,13,14.5,17,20,25,26,26,24,22,18,15]
plt.plot(x,y)
plt.savefig('./demo1_1.svg')
plt.show()
demo1_2显示图片
3.设置图片大小
fig=plt.figure(figsize=(20,8),dpi=80)
- figure图形图标的意思,这里指绘制的图
- 实例化figure对象,并传入figsize(大小)和dpi(清晰度)参数,使能够在后台自动使用figure实例
plt.savefig('./demo1_2.png')
- 通过plt.savafig保存图片,svg是矢量图,放大不会有锯齿
demo1_3显示图片
4.调整x,y轴上刻度
-
设置x的刻度
plt.xticks(x)
会自动根据每个x的间距对应刻度plt.xticks(x[::3])
每次间隔x开始值的3倍来取间隔值
-
控制坐标轴显示刻度个数
plt.locator_params(nbins=)
控制x,y坐标轴显示刻度个数,不会多于x的个数plt.locator_params('x',nbins=5)
控制x轴刻度显示个数
-
设置轴的刻度
-
导入MultipleLocator类,这个类用于设置刻度间隔
from matplotlib.pyplot import MultipleLocator
-
实例化两条坐标轴
axy=plt.gca()
-
通过坐标轴的xaxis.set_major_locator()方法设置x轴的刻度
axy.xaxis.set_major_locator(MultipleLocator(1))
-
-
设置坐标轴范围
plt.axis([-5,5,0,20])
分别定义了x轴,y轴的范围plt.xlim([xmin,xmax])
及plt.ylim([ymin,ymax])
分别定义x,轴和y轴的范围
5.中文显示
-
使用系统字体全局设置
import matplotlib as mpl
mpl.rcParams['font.sans-serif'] = ['Microsoft YaHei']
# 微软雅黑- ``mpl.rcParams['font.serif'] = ['Microsoft YaHei’]`
mpl.rcParams['axes.unicode_minus'] = False
# 解决保存图像是负号'-'显示为方块的问题,或者转换负号为字符串
-
使用下载字体局部设置
from matplotlib import font_manager
导入字体模块my_font=font_manager.FontProperties(fname='')
定义文字所在路径- 在需要中文显示的地方添加fontproperties=my_font 设置中文显示,fontsize= 设置字体大小
from matplotlib import pyplot as plt #从pyplot导入MultipleLocator类,这个类用于设置刻度间隔 from matplotlib.pyplot import MultipleLocator import random from matplotlib import font_manager import matplotlib as mpl #设置中文显示 #my_font=font_manager.FontProperties(fname=r'') mpl.rcParams['font.sans-serif'] = ['Microsoft YaHei'] # 微软雅黑 mpl.rcParams['font.serif'] = ['Microsoft YaHei'] mpl.rcParams['axes.unicode_minus'] = False # 解决保存图像是负号'-'显示为方块的问题,或者转换负号为字符串 fig=plt.figure(figsize=(20,8),dpi=80) x=range(120) random.seed(10)#设置随机种子,让不同时候随机得到的结果都一样 y=[random.uniform(20,35) for i in range(120)] plt.plot(x,y) _x_tick=['10点{}分'.format(i) for i in x if i<60] _x_tick+=['11点{}分'.format(i-60) for i in x if i>60] plt.xticks(x[::5],_x_tick[::5],rotation=90) #为了让字符不被覆盖,使用rotation选项,让字符串旋转90度显示 #plt.locator_params('x',nbins=3) '''ax=plt.gca() ax.xaxis.set_major_locator(MultipleLocator(1)) plt.xlim(0)''' plt.savefig('./demo1_4.png') plt.show()
demo1_5显示图片
6.坐标轴及标题显示
- x轴
plt.xlabel('时间’)
- y轴
plt.ylabel('温度’)
- 标题
plt.title('10点到12点分钟的时间变化情况’)
7.添加文字说明和注释
plt.text(x,y,'')
添加文字说明plt.annotate('注释', xy=(2, 1), xytext=(3, 1.5), arrowprops=dict(facecolor='black', shrink=0.05), )
- xy=()被注释的地方
- xytext=( )插入文本的地方
- arrowprops=dict()使用箭头小道具
8.叠加图
- 在原图上叠加:新的图用
plt.plot()
- 在同一个画布上绘几个子图
- #设置画布大小像素点
plt.figure(figsize=(14,14),dpi=100)
plt.subplot(numbRow , numbCol ,plotNum )
- numbRow是plot图的行数;numbCol是plot图的列数;plotNum是指第几行第几列的第几幅图
- #设置画布大小像素点
9.修改坐标轴位置
- 获得整张坐标图的对象
ax=plt.gca()
- 隐藏坐标轴:
- spines指包围图表的线条
ax.spines[‘right’].set_color(‘none’)
隐藏右边线条ax.spines[‘top’].set_color(‘none’)
隐藏上边线条
- 设置那条线为坐标轴
ax.xaxis.set_ticks_position(‘bottom’)
设置底下线条为x轴ax.yaxis.set_ticks_position(‘left’)
设置左边线条为y轴
- 指定x轴以及y轴的绑定:
ax.spines[‘bottom’].set_position((‘data’, 0))
设置x轴为x=0的位置ax.spines[‘left’].set_position((‘data’, 0))
设置y轴为y=0的位置- 两个坐标轴的交点是(0,0)
2.自定义绘图风格
在代码执行过程中,有两种方式更改参数:
- 使用参数字典(matplotlib.rcParams[‘ ‘]=[‘ ‘])
- 调用matplotlib.rc()命令 通过传入关键字元祖,修改参数
如果不想每次使用matplotlib时都在代码部分进行配置,可以修改matplotlib的文件参数。可以用matplot.get_config()
命令来找到当前用户的配置文件目录。
配置文件包括以下配置项:
axex: 设置坐标轴边界和表面的颜色、坐标刻度值大小和网格的显示
backend: 设置目标暑促TkAgg和GTKAgg
figure: 控制dpi、边界颜色、图形大小、和子区( subplot)设置
font: 字体集(font family)、字体大小和样式设置
grid: 设置网格颜色和线性
legend: 设置图例和其中的文本的显示
line: 设置线条(颜色、线型、宽度等)和标记
patch: 是填充2D空间的图形对象,如多边形和圆。控制线宽、颜色和抗锯齿设置等。
savefig: 可以对保存的图形进行单独设置。例如,设置渲染的文件的背景为白色。
verbose: 设置matplotlib在执行期间信息输出,如silent、helpful、debug和debug-annoying。
xticks和yticks: 为x,y轴的主刻度和次刻度设置颜色、大小、方向,以及标签大小。线条相关属性标记设置
1.用来该表线条的属性
plt.plot(linestye=' ')
线条风格plt.plot(linewidth=5)
线条粗细
线条风格linestyle或ls | 描述 | 线条风格linestyle或ls | 描述 | |
---|---|---|---|---|
‘-‘ | 实线 | ‘:’ | 虚线 | |
‘–’ | 破折线 | ‘None’,’ ‘,’’ | 什么都不画 | |
‘-.’ | 点划线 |
2.线条标记
plt.plot(marker=' ')
标记marker | 描述 | 标记 | 描述 | |
---|---|---|---|---|
‘o’ | 圆圈 | ‘.’ | 点 | |
‘D’ | 菱形 | ‘s’ | 正方形 | |
‘h’ | 六边形1 | ‘*’ | 星号 | |
‘H’ | 六边形2 | ‘d’ | 小菱形 | |
‘_’ | 水平线 | ‘v’ | 一角朝下的三角形 | |
‘8’ | 八边形 | ‘<’ | 一角朝左的三角形 | |
‘p’ | 五边形 | ‘>’ | 一角朝右的三角形 | |
‘,’ | 像素 | ‘^’ | 一角朝上的三角形 | |
‘+’ | 加号 | ‘\ | ‘ | 竖线 |
‘None’,’’,’ ‘ | 无 | ‘x’ | X |
3.颜色
plt.plot(color=' ')
- 可以通过调用
matplotlib.pyplot.colors()
得到matplotlib支持的所有颜色。
别名 | 颜色 | 别名 | 颜色 | |
---|---|---|---|---|
b | 蓝色 | g | 绿色 | |
r | 红色 | y | 黄色 | |
c | 青色 | k | 黑色 | |
m | 洋红色 | w | 白色 |
如果这两种颜色不够用,还可以通过两种其他方式来定义颜色值:
- 使用HTML十六进制字符串
color='eeefff'
使用合法的HTML颜色名字(’red’,’chartreuse’等)。 - 也可以传入一个归一化到[0,1]的RGB元祖。
color=(0.3,0.3,0.4)
很多方法可以介绍颜色参数,如title()。
plt.tilte('Title in a custom color',color='#123456')
4.背景色
通过向如matplotlib.pyplot.axes()
或者matplotlib.pyplot.subplot()
这样的方法提供一个axisbg
参数,可以指定坐标这的背景色。
subplot(111,axisbg=(0.1843,0.3098,0.3098)
5.添加图例
plt.plot(lable=' ‘)
中用label标签定义图例名plt.legend(prop=,loc='best')
指定图例的参数- prop指定字体,loc指定图例位置,默认右上角
3.对比常用统计图
-
折线图:以折线的上升或下降来表示统计数量的增减变化的统计图
特点:能够显示数据的变化趋势,反映事物的变化情况。
-
直方图:由一系列高度不等的纵向条纹或线段表示数据分布的情况。
一般用横轴表示数据范围,纵轴表示分布情况。
特点:绘制连续性的数据,展示一组或者多组数据的分布状况(统计)
-
条形图:排列在工作表的列或行中的数据可以绘制到条形图中。
特点:绘制连离散的数据,能够一眼看出各个数据的大小,比较数据之间的差别。(统计)
-
散点图:用两组数据构成多个坐标点,考察坐标点的分布,判断两变量
之间是否存在某种关联或总结坐标点的分布模式。
特点:判断变量之间是否存在数量关联趋势,展示离群点(分布规律)
3.1散点图
plt.scatter(x,y)
- 获取到了北京2016年3,10月份每天白天的最高气温(分别位于列表a,b),通过散点寻找出气温和随时间(天)变化的某种规律
from matplotlib import pyplot as plt
import matplotlib as mpl
#设置中文显示
#my_font=font_manager.FontProperties(fname=r'')
mpl.rcParams['font.sans-serif'] = ['Microsoft YaHei'] # 微软雅黑
mpl.rcParams['font.serif'] = ['Microsoft YaHei']
mpl.rcParams['axes.unicode_minus'] = False # 解决保存图像是负号'-'显示为方块的问题,或者转换负号为字符串
#plt.style.use('ggplot')#作出ggplot风格的图片
a = [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]
b = [26,26,28,19,21,17,16,19,18,20,20,19,22,23,17,20,21,20,22,15,11,15,5,13,17,10,11,13,12,13,6]
_x=range(len(a))
_y=range(len(a)+10,len(a)+10+len(b))
#绘制散点图
plt.scatter(_x,a,color='blue',label='3月')
plt.scatter(_y,b,color='orange',label='10月')
#设置x轴刻度显示
x=[]
for i in range(1,32):
x.append('3月{}日'.format(i))
for j in range(1,32):
x.append('10月{}日'.format(j))
_x_tick=[i for i in _x ]
_x_tick.extend([j for j in _y])
plt.xticks(_x_tick[::3],x[::3],rotation=45)
plt.legend(loc='best')
plt.title('3月和10月的温度变化')
plt.savefig('./demo3_1.png')
plt.show()
demo3_1显示图片
3.2条形图
plt.bar(x,y,width=,color='')
竖着的条形图plt.barh(x,y,width=,color='’)
横着的条形图- 将获取到的2017年内地电影票房前20的电影(列表a)和电影票房数据(列表b),使用条形图更加直观的展示该数据
from matplotlib import pyplot as plt
import matplotlib as mpl
#设置中文显示
#my_font=font_manager.FontProperties(fname=r'')
mpl.rcParams['font.sans-serif'] = ['Microsoft YaHei'] # 微软雅黑
mpl.rcParams['font.serif'] = ['Microsoft YaHei']
mpl.rcParams['axes.unicode_minus'] = False # 解决保存图像是负号'-'显示为方块的问题,或者转换负号为字符串
a = ["战狼2","速度与激情8","功夫瑜伽","西游伏妖篇",\
"变形金刚5:最后的骑士","摔跤吧!爸爸",\
"加勒比海盗5:死无对证","金刚:骷髅岛",\
"极限特工:终极回归","生化危机6:终章",\
"乘风破浪","神偷奶爸3","智取威虎山","大闹天竺",\
"金刚狼3:殊死一战","蜘蛛侠:英雄归来","悟空传",\
"银河护卫队2","情圣","新木乃伊",]
b=[56.01,26.94,17.53,16.49,15.45,12.96,11.8,11.61,\
11.28,11.12,10.49,10.3,8.75,7.55,7.32,6.99,6.88,
6.86,6.58,6.23]
plt.bar(a,b,width=0.2,color='orange')
plt.ylabel('电影票房(单位:亿)')
plt.title('2017年电影票房top20')
plt.xticks(a,a,rotation=90)#通过设置xticks使数值和字符串对应
plt.savefig('./demo3_2_1.png')
plt.show()
demo3_2_1显示图片
- 知道了列表a中电影分别在2017-09-14(b_14), 2017-09-15(b_15), 2017-09-16(b_16)三天的票房,为了展示列表中电影本身的票房以及同其他电影的数据对比情况,使用条形图更加直观的呈现该数据
from matplotlib import pyplot as plt
import matplotlib as mpl
#设置中文显示
#my_font=font_manager.FontProperties(fname=r'')
mpl.rcParams['font.sans-serif'] = ['Microsoft YaHei'] # 微软雅黑
mpl.rcParams['font.serif'] = ['Microsoft YaHei']
mpl.rcParams['axes.unicode_minus'] = False # 解决保存图像是负号'-'显示为方块的问题,或者转换负号为字符串
a = ["猩球崛起3:终极之战","敦刻尔克","蜘蛛侠:英雄归来","战狼2"]
b_16 = [15746,312,4497,319]
b_15 = [12357,156,2045,168]
b_14 = [2358,399,2358,362]
_x=range(len(a))
plt.bar(_x,b_14,width=0.2,color='blue',label='9月14')
plt.bar([i+0.2 for i in _x],b_15,width=0.2,color='orange',label='9月15')#紧接9月14显示
plt.bar([i+0.2*2 for i in _x],b_16,width=0.2,color='green',label='9月16')
plt.legend(loc='best')#图例
plt.ylabel('票房(单位:亿)')#标签
plt.title('9月14,15,16三天电影的票房')
#设置坐标轴刻度在9月15号中间
_x_ticks=[i+0.2 for i in _x]
plt.xticks(_x_ticks,a)#通过设置xticks使数值和字符串对应
plt.savefig('./demo3_2_2.png')
plt.show()
demo3_2_2显示图片
3.3绘制直方图
-
plt.hist(数据,组数)
绘制直方图时数据要是没统计过的,不然应该绘制条形图 -
plt.hist(数据,[min(数据)+i*bin_width for i in range(num_bins)])
- 可以传入一个列表,长度为组数,值为分组依据,当组距不均匀的时候使用
-
plt.hist(数据,组数,normed=1)
normed=bool是否绘制频率直方图,默认绘制 -
plt.grid(True,linestye='-',alpha=0.5)
#绘制网格,alpha透明度 -
获取了250部电影的时长(列表a中),希望统计出这些电影时长的分布状态(比如时长为100分钟到120分钟电影的数量,出现的频率)等信息,通过直方图呈现这些数据
-
把数据分为多少组进行统计?组数要适当,太少会有较大的统计误差,大多规律不明显
-
组数:将数据分组,当数组在100个以内时,按数据多少常分5-12组
-
组距:指每个小组两个端点之间的距离
-
组距:
\[组数num\_bins=\frac{极差}{组距}=\frac{max(a)-min(a)}{bin\_width} \]
-
from matplotlib import pyplot as plt
import matplotlib as mpl
#设置中文显示
#my_font=font_manager.FontProperties(fname=r'')
mpl.rcParams['font.sans-serif'] = ['Microsoft YaHei'] # 微软雅黑
mpl.rcParams['font.serif'] = ['Microsoft YaHei']
mpl.rcParams['axes.unicode_minus'] = False # 解决保存图像是负号'-'显示为方块的问题,或者转换负号为字符串
#plt.style.use('ggplot')#作出ggplot风格的图片
a=[131, 98, 125, 131, 124, 139, 131, 117, 128, 108, 135, 138, 131, 102, 107, 114, 119, 128, 121, 142, 127, 130, 124, 101, 110, 116, 117, 110, 128, 128, 115, 99, 136, 126, 134, 95, 138, 117, 111,78, 132, 124, 113, 150, 110, 117, 86, 95, 144, 105, 126, 130,126, 130, 126, 116, 123, 106, 112, 138, 123, 86, 101, 99, 136,123, 117, 119, 105, 137, 123, 128, 125, 104, 109, 134, 125, 127,105, 120, 107, 129, 116, 108, 132, 103, 136, 118, 102, 120, 114,105, 115, 132, 145, 119, 121, 112, 139, 125, 138, 109, 132, 134,156, 106, 117, 127, 144, 139, 139, 119, 140, 83, 110, 102,123,107, 143, 115, 136, 118, 139, 123, 112, 118, 125, 109, 119, 133,112, 114, 122, 109, 106, 123, 116, 131, 127, 115, 118, 112, 135,115, 146, 137, 116, 103, 144, 83, 123, 111, 110, 111, 100, 154,136, 100, 118, 119, 133, 134, 106, 129, 126, 110, 111, 109, 141,120, 117, 106, 149, 122, 122, 110, 118, 127, 121, 114, 125, 126,114, 140, 103, 130, 141, 117, 106, 114, 121, 114, 133, 137, 92,121, 112, 146, 97, 137, 105, 98, 117, 112, 81, 97, 139, 113,134, 106, 144, 110, 137, 137, 111, 104, 117, 100, 111, 101, 110,105, 129, 137, 112, 120, 113, 133, 112, 83, 94, 146, 133, 101,131, 116, 111, 84, 137, 115, 122, 106, 144, 109, 123, 116, 111,111, 133, 150]
bin_width=3#组距
num_bins=int((max(a)-min(a))/bin_width)#组数
plt.hist(a,num_bins)
plt.xticks(list(range(min(a),max(a)))[::bin_width],rotation=45)
plt.grid(True,linestyle='-',alpha=0.5)#绘制网格
plt.xlabel('时长(单位:分钟')
plt.ylabel('数量')
plt.title('250部电影的时长分布')
plt.savefig('./demo3_3.png')
plt.show()
demo3_3显示图片
3.4绘制饼图
-
plt.pyplot.pie( )
-
pie(x, explode=None, labels=None, colors=None, autopct=None,
pctdistance=0.6, shadow=False, labeldistance=1.1, startangle=None,
radius=None, counterclock=True, wedgeprops=None, textprops=None,
center=(0, 0), frame=False, rotatelabels=False, hold=None, data=None) -
-
x :(每一块)的比例,如果sum(x) > 1会使用sum(x)归一化;
-
labels :(每一块)饼图外侧显示的说明文字;
-
explode :(每一块)离开中心距离;
-
startangle :起始绘制角度,默认图是从x轴正方向逆时针画起,如设定=90则从y轴正方向画起;
-
shadow :在饼图下面画一个阴影。默认值:False,即不画阴影;
-
labeldistance :label标记的绘制位置,相对于半径的比例,默认值为1.1, 如<1则绘制在饼图内
-
autopct :控制饼图内百分比设置,可以使用format字符串或者format function
'%1.1f'指小数点前后位数(没有用空格补齐); -
pctdistance :类似于labeldistance,指定autopct的位置刻度,默认值为0.6;
-
radius :控制饼图半径,默认值为1;counterclock :指定指针方向;布尔值,可选参数,默认为:True,即逆时针。将值改为False即可改为顺时针。wedgeprops :字典类型,可选参数,默认值:None。参数字典传递给wedge对象用来画一个饼图。例如:wedgeprops={'linewidth':3}设置wedge线宽为3。
-
textprops :设置标签(labels)和比例文字的格式;字典类型,可选参数,默认值为:None。传递给text对象的字典参数。
-
center :浮点类型的列表,可选参数,默认值:(0,0)。图标中心位置。
-
frame :布尔类型,可选参数,默认值:False。如果是true,绘制带有表的轴框架。
-
rotatelabels :布尔类型,可选参数,默认为:False。如果为True,旋转每个label到指定的角度。
-
-
from matplotlib import pyplot as plt
import matplotlib as mpl
#设置中文显示
#my_font=font_manager.FontProperties(fname=r'')
mpl.rcParams['font.sans-serif'] = ['Microsoft YaHei'] # 微软雅黑
mpl.rcParams['font.serif'] = ['Microsoft YaHei']
mpl.rcParams['axes.unicode_minus'] = False # 解决保存图像是负号'-'显示为方块的问题,或者转换负号为字符串
#plt.style.use('ggplot')#作出ggplot风格的图片
labels = ['娱乐','育儿','饮食','房贷','交通','其它']
sizes = [2,5,12,70,2,9]#每块比例
explode = (0,0,0,0.1,0,0)#距离中心点位置
##保留1位小数点,增加百分号(%)
plt.pie(sizes,explode=explode,labels=labels,autopct='%1.1f%%',shadow=False,startangle=150)
plt.title("饼图示例-8月份家庭支出")
plt.savefig('./demo3_4.png')
plt.show()
demo3_4显示图片