Matplotlib(基于python)


matplotlib支持的图形地址

plotly:可视化工具中的github,相比于matplotlib更加简单,图形更加漂亮,同时兼容matplotlib和pandas

用法文档地址

1.基本要点

1.导入matplolib

from matplotlib import pyplot as plt

2.绘制出折线图

  1. 数据在x轴和y轴的位置,是可迭代对象
  2. 将x,y值传入plt.plot(),绘制出折线图
  3. 只传入一个对象,默认是y,x从0到n-1
  4. 通过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显示图片

demo1_1

3.设置图片大小

  • fig=plt.figure(figsize=(20,8),dpi=80)
    • figure图形图标的意思,这里指绘制的图
    • 实例化figure对象,并传入figsize(大小)和dpi(清晰度)参数,使能够在后台自动使用figure实例
  • plt.savefig('./demo1_2.png')
    • 通过plt.savafig保存图片,svg是矢量图,放大不会有锯齿

demo1_3显示图片

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显示图片

    dem01_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显示图片

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显示图片

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显示图片

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显示图片

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)

      1. x :(每一块)的比例,如果sum(x) > 1会使用sum(x)归一化;

      2. labels :(每一块)饼图外侧显示的说明文字;

      3. explode :(每一块)离开中心距离;

      4. startangle :起始绘制角度,默认图是从x轴正方向逆时针画起,如设定=90则从y轴正方向画起;

      5. shadow :在饼图下面画一个阴影。默认值:False,即不画阴影;

      6. labeldistance :label标记的绘制位置,相对于半径的比例,默认值为1.1, 如<1则绘制在饼图内

      7. autopct :控制饼图内百分比设置,可以使用format字符串或者format function
        '%1.1f'指小数点前后位数(没有用空格补齐);

      8. pctdistance :类似于labeldistance,指定autopct的位置刻度,默认值为0.6;

      9. radius :控制饼图半径,默认值为1;counterclock :指定指针方向;布尔值,可选参数,默认为:True,即逆时针。将值改为False即可改为顺时针。wedgeprops :字典类型,可选参数,默认值:None。参数字典传递给wedge对象用来画一个饼图。例如:wedgeprops={'linewidth':3}设置wedge线宽为3。

      10. textprops :设置标签(labels)和比例文字的格式;字典类型,可选参数,默认值为:None。传递给text对象的字典参数。

      11. center :浮点类型的列表,可选参数,默认值:(0,0)。图标中心位置。

      12. frame :布尔类型,可选参数,默认值:False。如果是true,绘制带有表的轴框架。

      13. 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显示图片

demo3_4

原文地址:https://www.cnblogs.com/yffxwyy/p/13941623.html