Matplotlib的基本元素:

1,变量

2,函数

3,画布(figure)

4,坐标轴(axes)

绘图过程:变量和函数通过改变figure和axes中的元素(如:title,label)一起描述figure和axes

Matplotlib的图像位于figure对象中

通过plt.figure()创建

  如果没有指定创建,matplotlib会自动生成默认的画布

  参数figsize用来控制画布的大小,单位为英寸(inch), 1 inch = 2.54 cm

用plt.show()显示绘图结果

注意的是,在jupyter notebook中使用matplotlib时,代码块需要放在一个cell中

import matplotlib.pyplot as plt
import numpy as np

plt.figure() # 创建画布
Out[19]: <Figure size 640x480 with 0 Axes>
data = [2,4,6,8,10]  #构造数据

# 可视化数据
plt.plot(data)  #plot是绘制折线
Out[21]: [<matplotlib.lines.Line2D at 0xc35eb10>]
plt.show()

plt.figure(figsize=(15, 6))  # 控制画布大小
plt.plot(np.random.randn(100))
plt.show()

①散点图:

plt.scatter(x, y, s,c,marker)  # s,c,marker有默认值

* x 横轴的数据

* y 纵轴的数据

* s点的大小,标量或数组 →标量:同时所有点的大小(颜色)

* c点的颜色,标量或数组→数组:为每一个点设置不同的大小(颜色)

* marker点的样式

②柱状图:

plt.bar(x,xheight,color)

* x柱子的横坐标

*height 柱子的高度(数据)

*color柱子的颜色

注意:绘制多组柱状图时,需要设置不同的横坐标,防止重叠

x1 = [1,3,5,7,9]
data1=[5,2,7,8,2]
plt.bar(x1,data,color='r')
x2 = np.array(x1)+1  # 设置不同的横坐标防止覆盖
plt.bar(x2, np.array(data1)+2, color='g')
plt.show()

要求在同一个画布上绘制A同学和B同学的成绩,设置画布的大小为10*5,柱子的宽度为0.5,绘制图例,A同学的柱子颜色用红色表示,B同学柱子的颜色用蓝色表示,x轴标签是year,y轴标签为score。



plt.figure(figsize=(10,5))



year=["2016","2017","2018","2019"]



x_A=[1,3,5,7]



score_A = [40,50,59,60]



w =0.5



plt.bar(x_A,score_A,(1)=w,label="A")



 



x_B=np.array(x_A)+w



score_B = [50,70,80,90]



plt.bar(x_B,(2),width=w,(3)="B")



plt.xlabel("year")



plt.(4)("score")



plt.legend()



plt.xticks(x_B-0.25,year)



plt.show()
填空(1): 正确答案 width
填空(2): 正确答案 score_B
填空(3): 正确答案 label
填空(4): 正确答案 ylabel
View Code

③直方图:

形式类似于柱状图

* 通过将数据组合在一起来显示分布比如:显示各年龄段的数据个数plt.hist(x, bins, rwidth)

* x 数据rwidth柱子宽度比例,默认为1

* bins 分组的个数或分组边界,如4[20, 30, 40, 50, 60]

*** 除了最后一组,其余组的右边界是开放的[20, 30), [30, 40), [40, 50), [50, 60]

 

 

import matplotlib.pyplot as plt
ages = [22,23,26,21,34,36,29,19,24,35,42,48,33,22,45]
bins = 5  # 分为5组
plt.hist(ages, bins)
plt.show()

 

import matplotlib.pyplot as plt
ages = [22,23,26,21,34,36,29,19,24,35,42,48,33,22,45]
bins = [15,25,35,45,55]
plt.hist(ages, bins, histtype='bar', rwidth=0.5)
plt.show()

 柱子变窄了

 ④子图:

 子图是什么意思呢,就是在一张图中绘制多个图

看一个例子:

import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
fig, subplot_arr = plt.subplots(2,2,figsize=(8,8))
subplot_arr[0,0].scatter(np.random.randn(50), np.random.randn(50)*2)
subplot_arr[0,1].bar([1,2,3,4,5], [5,2,7,8,2])
subplot_arr[1,0].hist(np.random.randn(50), bins=10, rwidth=0.8)
subplot_arr[1,1].imshow(np.random.randn(5,5))

plt.show()

成图如下:

那如果共享x轴

import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
fig, subplot_arr = plt.subplots(2,2,figsize=(8,8), sharex=True)  # 共享x轴
subplot_arr[0,0].scatter(np.random.randn(50), np.random.randn(50)*2)
subplot_arr[0,1].bar([1,2,3,4,5], [5,2,7,8,2])
subplot_arr[1,0].hist(np.random.randn(50), bins=10, rwidth=0.8)
subplot_arr[1,1].imshow(np.random.randn(5,5))

plt.show()

共享y轴:

import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
fig, subplot_arr = plt.subplots(2,2,figsize=(8,8), sharey=True)  # 共享y轴
subplot_arr[0,0].scatter(np.random.randn(50), np.random.randn(50)*2)
subplot_arr[0,1].bar([1,2,3,4,5], [5,2,7,8,2])
subplot_arr[1,0].hist(np.random.randn(50), bins=10, rwidth=0.8)
subplot_arr[1,1].imshow(np.random.randn(5,5))

plt.show()

看个练习:

使用subplots生成4子图,第一个子图ax[0,0]对x数据进行可视化,第二个子图ax[0,1]对np.sin(x)的数据进行显示,第三个子图ax[1][0]对np.cos(x)数据进行显示,第四个子图ax[1][1]对x的平方进行显示,并且,子图公用x轴。



fig,ax =  plt.subplots((1),2,sharex=(2))



x = [0,90,180,270,360,450]



data=[np.array(x),np.sin(x),np.cos(x),np.array(x)**2]



for i in range(2):



    for j in range(2):



        if i==0:



            ax[i][j].plot(x,data[i+j])



        else:



            ax[i][j].plot(x,data[i+j+1])



plt.show()


填空(1): 正确答案 2, 你的答案 2。
填空(2): 正确答案 True, 你的答案 True。
回答正确。

 收藏  展开解析
2
50.0分
在一个画布上绘制两个子图,其中第一个子图的title设置为title0,第二个子图的title设置为title1,并且设置子图共用一个y轴。



x = np.random.randint(1,10,size=8)



y = np.sin(x)



fig, ax = plt.(1)(nrows=1,ncols=2,(2)=True)



plot_method = []



i=0



for col in ax:



    col.plot(x, y)



    col.set_title('title'+str((3)))



    col.set_xlabel('x-axis')



    i+=1



plt.show()



》》》》



填空(1): 正确答案 subplots。
填空(2): 正确答案 sharey
填空(3): 正确答案 i

matplotlib颜色,标记和线型

先看个示例:

fig, subplot_arr = plt.subplots(2,2,figsize=(8,8))
data = np.random.randn(20)
subplot_arr[0,0].plot(data,'r.--')
subplot_arr[0,1].plot(data,'gv:')
subplot_arr[1,0].plot(data,'b<-')
subplot_arr[1,1].plot(data,'ys-.')

plt.show()

他的灵活性在于fmt参数值得顺序可以颠倒,甚者缺失部分

matplotlib的坐标刻度标签,图例,标题

 

 在xtick上需要传入的是两个列表,第一个用来标识真实值,第二个指的是标签

 

但是需要注意的是,在Linux上面是不管用的,需要指定其他字体

 

data1 = np.random.randn(1000).cumsum()
data2 = np.random.randn(1000).cumsum()
data3 = np.random.randn(1000).cumsum()
# 基本显示
plt.figure()
plt.plot(data1)
plt.plot(data2)
plt.plot(data3)
plt.show()

使用plt

data1 = np.random.randn(1000).cumsum()
data2 = np.random.randn(1000).cumsum()
data3 = np.random.randn(1000).cumsum()
# 基本显示
# plt.figure()
# plt.plot(data1)
# plt.plot(data2)
# plt.plot(data3)
# plt.show()
# 使用plt配置
plt.figure()
plt.xlim([0,500])#设置刻度宽度
plt.xticks([0,100,200], ['x', 'xx', 'xxx'])#设置自定义的刻度
#设置坐标轴标签
plt.xlabel('Number')
plt.ylabel('Random')
#设置标题
plt.title('Example')
#图例
plt.plot(data1)
plt.plot(data2, label='line2')
plt.plot(data3, label='line3')

plt.legend(loc='best')
plt.show()

 

 使用ax

fig, ax = plt.subplots(1)
ax.plot(data1, label='line1')
ax.plot(data2, label='line2')
ax.plot(data3, label='line3')
#设置刻度
ax.set_xlim([0,800])
#设置显示的刻度
ax.set_xticks([0,100, 200, 300, 400,500])
#设置坐标轴标签
ax.set_xticklabels(['x1', 'x2', 'x3', 'x4', 'x5'])
#设置坐标轴标签
ax.set_xlabel('Number')
ax.set_ylabel('Random')
#设置标题
ax.set_title('Examples2')
plt.show()

 

posted on 2019-04-08 20:55  人生苦短use,what?  阅读(288)  评论(0编辑  收藏  举报