Python数据分析-Matplotlib图标绘制

Matplotlib介绍

  Matplotlib是一个强大的Python绘图和数据可视化的工具包。 

Matplotlib的主要功能

  Matplotlib是python中的一个包,主要用于绘制2D图形(当然也可以绘制3D,但是需要额外安装支持的工具包)

Matplotliban安装、调用

   安装:pip install matplotlib

  调用:import matplotlib.pyplot as plt

 

Plot函数绘制多条曲线

一维参数

例如传入一个list对象使用plot,打印输出形成的图像

a=[1,2,3]
plt.plot(a)  #只有一个参数时,值代表y轴的值,x为值对应的索引
plt.show()

结果:plot画出的图中横坐标是list的index,纵坐标是list的value,他会在图上形成三个点,然后将点连成线,所以它形成的是折线图,因为list满足线性关系(y的值是连续的),所以形成的图像是一个直线

二维参数

例如传入2个list对象使用plot,打印输出形成的图像

a=[1,2,3]
b=[4,5,6]
plt.plot(a,b)
plt.show()

结果:

 折线图会根据传入参数的变化,线形状会发生变化

注意:传入的2个参数数值位数必须一致,否则会出现ValueError报错

设定线条风格(点线、虚线、圆点、颜色设置

线型linestyle(-,-.,--,.点型marker(v,^,s,*,H,+,x,D,o,…颜色color(b,g,r,y,k,w,…

1.默认是实现,可以设置成点线和虚线

2.默认是蓝色,可以设置成其他颜色

 虚线 ' -- ' ,参数指定了线的类型为虚线

a=[1,2,3]
b=[4,5,8]
plt.plot(a,b,'--')
plt.show()

点线 ‘ * ’,参数制定了线的类型为点线(plt.plot(a,b,'o'), o 表示圆点

a=[1,2,3]
b=[4,5,8]
plt.plot(a,b,'*') 
plt.show()

颜色 

例如设定红色线条

a=[1,2,3]
b=[4,5,8]
plt.plot(a,b,'r') #plt.plot(a,b,'red') 也可以直接写颜色的英文单词
plt.show()

形状+颜色联合设定,例如设定绿色+虚线线条

a=[1,2,3]
b=[4,5,8]
plt.plot(a,b,'g--') #绿色并且虚线
plt.show()

绘制多条曲线

#plot函数绘制多条曲线
标题:set title
x轴: set xlabel
y轴: set ylabel

只需要依次指定每组(两两)线条的x、y坐标即可

#一个图像中绘制多个线条
a=[1,2,3]
b=[4,5,8]
c=[7,8,6]
d=[1,5,2]
plt.plot(a,b,c,d,'r--')
plt.show()

可以给不同线条指定不同的风格

a=[1,2,3]
b=[4,5,8]
c=[7,8,6]
d=[1,5,2]
plt.plot(a,b,'bo',c,d,'r+')
plt.show()

 

 多曲线基础操作演示

1)首先生成数据,绘制2条线

#一个窗口下绘制两条线,并对其添加显示内容
t=np.arange(0,2,0.1)
print(t)
print(t.size) #20

#np.sin()取传入的参数的正弦
#np.pi 是一个常量,代表3.1415926...
s=np.sin(t*np.pi)
print(s)
print(s.size) #20
'''
[ 0.00000000e+00  3.09016994e-01  5.87785252e-01  8.09016994e-01
  9.51056516e-01  1.00000000e+00  9.51056516e-01  8.09016994e-01
  5.87785252e-01  3.09016994e-01  1.22464680e-16 -3.09016994e-01
 -5.87785252e-01 -8.09016994e-01 -9.51056516e-01 -1.00000000e+00
 -9.51056516e-01 -8.09016994e-01 -5.87785252e-01 -3.09016994e-01]

'''
plt.plot(t,s,'r--',t*2,s,'g--')
plt.show()

显示结果

2)为x、y轴坐标设置标签label说明

plt.plot(t,s,'r--',t*2,s,'g--')
plt.xlabel('x轴')
plt.ylabel('y轴')
plt.show()

 结果:存在两个问题    1):中文无法识别   2):坐标负号显示可能会有问题

做数据分析时,可以提前再开头写入这2行,避免中文、负号识别问题:

解决问题1:中文内容无法识别问题,在建立图标之前加入一行代码

#解决中文标签不显示问题plt.rcParams['font.sans-serif'] = ['SimHei']

解决问题2:坐标轴上负号无法显示的问题

#负号显示问题
plt.rcParams['axes.unicode_minus'] = False

3)为图像指定title标题说明

plt.title('元素正弦图示')

4)为图像指定图例label(即每条线设置描述说明)

#分别为2条线侧面添加描述说明
plt.plot(t,s,'r--',label='线条一走向')
plt.plot(t*2,s,'g--',label='线条二走向')

plt.xlabel('x轴')
plt.ylabel('y轴')
plt.title('元素正弦图示')

#一定要加结束语
plt.legend()

plt.show()

最终显示结果

 

曲线图操作展示初级

(1)numpy+matplotlib结合,根据提供的值得出x、y轴的显示图

import matplotlib.pyplot as plt

import numpy as np
import pandas as pd

#实例1

#从[-1,1]中取50个等差值
x=np.linspace(-1,1,50)
#print(x)

y=2*x +1

#x:横坐标的值 y:纵坐标的值
res1=plt.plot(x,y)
print(res1)  #[<matplotlib.lines.Line2D object at 0x0ACE2350>] 返回的是一个matplotlib.lines.Line2D对象

#将设置好的figure(图形、形状)显示出来
plt.show()

结果为

 

延伸:变化如果y=2^x,再次求最终的图像显示

x=np.linspace(-1,1,50)
#y=2^x平方,因为不是同比增长,生成的图像如下
y=2**x +1
plt.plot(x,y)
plt.show()

 结果为

 

 

hist函数绘制频数直方图

实验一:

第一步:生成一个100*100初始值为0的二维数组

import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
import random
第一步:生成一个100*100初始值为0的二维数组
data=np.zeros((100,100),dtype=int)

第二步:利用random模块将数组中每个值变为0-20的随机值

第二步:利用random模块将数组中每个值变为0-20的随机值
for i in range(len(data)):
    #拿到每一行数组的长度
    for j in range(len(data[0])):

        #根据以上2个参数可以一次循环取出数组中的没一个参数,并通过下面操作给每个参数随机赋值
        data[i][j] = random.randint(1,20)

print('初始Numpy,data数组的变化')
print(type(data))  #<class 'numpy.ndarray'>

第三步:将Numpy数组类型转为DataFrame类型(即让数组有横竖的坐标)

第三步:将Numpy数组类型转为DataFrame类型(即让数组有横竖的坐标)
data_new=pd.DataFrame(data)
print(data_new)

'''
DataFrame变化后的改变
 0   1   2   3   4   5   6   7   8  ...  91  92  93  94  95  96  97  98  99
0   12   5  13   3  19   4   1   4  10 ...  14   2  14  10   4  10  13  15  15
1   12  18  16  20   6   7   1  14  18 ...   4  15  19   8  20  16  15   8  12
2   15   9   1   3  18  12  20  20   9 ...  20   2   1   9  17   9  17   2   2
3   10  15   8   2   3  16  13  13  19 ...  10  14  15  17   4   7   2  11   9
4    1   3   6  10  11  14   3  10  13 ...   8  19   1  12   2  10  20   6   5
5   20  19  11   8   1  19   1   2   6 ...   1  16  18   7  17  15  20  15   2
6    7  14  18   2  14  18   2  14  15 ...  14  11  16  14  12  17   8  10   4
7   20  12  17   5  11  10  10   8  14 ...   7  20   1   5  10  15  18  13  10
8   17  16  14   5   7  11   5  16   8 ...  18   8   4   7   7   3  17  10  20
9    6   7  16  13   7  15  13  15   5 ...   7   5   9   8   7   1  14  15  17
10   1  10   9   5   5  11  16  20  10 ...  17  18  18   7  16   3  11   7  13
11   3  10  15  17   9  16  19  13   1 ...   5   5  18   1   7  16  15  13   4
12  13  10  18  17  16  10  12  16   7 ...  12   2   7  16  12  19   7  11  12
13   4  10  20   1   1   1  19   6  17 ...  16   5  19  12  16  14  18  14  13
14   9  13  18   6  10   8   9   4   1 ...   9  12   6   8  10   1  10   9  18
15   6  11   4   5  17   1  10   2  12 ...  20   1  17   8   7   9  17  19  14
16   9   2  17   4  17  16   8  16   3 ...  10  11   5  16   1   2   7  18  16
17  16   3   2  16  15  17   8   8  13 ...  17   4  11  14   9  12  12   5  14
18   9   3  18   1   7  20   1  18  14 ...   1   5   2  12   9  10   6   4  12
19  19  18   3  13  18  17   7  12   5 ...  15   2   3  19   8   5   3   7  14
20  20  15   5  14   1  19  10   7  16 ...  12  14  12  12  18  15  17   4   6
21  10  20  19   6   6  20  18  20   5 ...  19   6  20   9   4  15  16  20   5
22  14  12   2   3   4  14   6   2  16 ...  16  10   5  20   3  14  20   6  19
23  14  18   6  12   3  11  10   8   8 ...   9   2   7  13  13  14   3  13   1
24   2  16   3  20   4  15  15   2   9 ...  20   7  16  13   3   1  18   5  17
25   9  17   8  15   5  16   1  19   3 ...  17   8   7   4   2  13   4  13  14
26  16  12   7  19  13   1  19  16   7 ...  15  11   3  19  19   4   2   1   6
27   8  14   2   6   7  16  11  19  19 ...  10   7   9  12  18  17  14  12   9
28   6  14  12  13  18  20  10   9  12 ...  15   2  20  14  11   6  16  19   3
29  18   3  13  15  20   5  10  18  17 ...   5  17  11  20  10  15   3  12   9
..  ..  ..  ..  ..  ..  ..  ..  ..  .. ...  ..  ..  ..  ..  ..  ..  ..  ..  ..
70   5   9  20   9  20   4   3  12  17 ...  10   6  17  14   1   9   6  10  10
71  11  10  17  14  19   2   4  19   5 ...   8   4   7   1  20  13   7  11  15
72  13  11  16  15   3   8   4  17  13 ...   6   8  20   3  12   8  14  20   7
73   2  19   6   1  12   2  14  10  14 ...  10  17   9   1  18   1   6  14   7
74   3   8  17   1  12   4  17  18   7 ...  16  10  15   6  16   3   5   8  17
75   1  15   4   9  20   5  16   9  20 ...  18  13  10   6  19   9  20  12  16
76  16   6   6  19   4   5   8   1  11 ...  17  17  20   6  14   1   4   5   1
77  15   4  16  19   8   4  11  10  12 ...   1   6  19  13  12  16  10   3  13
78  18  16  20  13  16  15  18  11   4 ...   4  12   5  17  16  18  15  17  10
79  20   1  18   6   3   7  19   6  10 ...  14  16  12   8  15   9   5   6   6
80  15  14   4   1  14   8  10  18  14 ...  13  10  18  16   5   8  11   7   4
81   3  19   1   8  13   8  20  19   8 ...   7  19   9   9   9   6  10  19  20
82   9  18  19   1   3   1  13   6   3 ...   8  14   7   5  14   3   7   5  11
83  15   5  14  13  18   3   1   5  10 ...  12   7  14   5   1  11   7   6   3
84  12  18  16  10  19   6   9   3   8 ...  19   7   1   7   9  12   6  20  13
85  16  16   2  17   3   3   8  15   2 ...   1  20  15   1  17  19  16   4   4
86   2  12  11   7   5  14  19  19  18 ...   3   4  16   2   8   6  13  18  11
87  10  13  19  20   6  17   3  20   7 ...  16   2   8  20  19  14  17   6   7
88   6   3   7  12  13  19   1  17  14 ...  14  10  18  12  14  14   4  12   8
89  16   8  19  12  14  15   2  11  19 ...   2  18  20   6  18   9  20  10   2
90  12  17  19  19  17  18  18  14   6 ...   7  13  16   5   3  16  10   4  11
91  16   1  13  13   4  12  18  12   4 ...  11  19   5   6  18  18   9  17  17
92   3   8  10   1  13   1  15  19  19 ...  20  18  15   5  14  12  13  16   8
93  11   9  12  10   4   2  14   6  16 ...   6  11  11   9  11   7   8  17  14
94  13   3   6   3  16   3   3  11  10 ...   8   6  17  17  14   9   7   4   5
95   2   3   9  17   1  14  17   3  18 ...   3   4  12   6   7  14  12  14   8
96   3  18   8   5  11  10  11  11  19 ...   2  13  15  14  18   9  11  13  19
97   2   3   5  15   5   7  13   4  16 ...  12   2  16   5   1  10  10   2  13
98   3   9   6   4   2  13   5  20  12 ...   6  20  14   7   6   4  10  12  14
99  20  16   3  12  14  11  14   7  10 ...   9   3  11  17   5   3   9   1  15


'''
print(type(data_new))  #<class 'pandas.core.frame.DataFrame'>

第四步:从DataFrame数组中取第1列的值

#拿到第一列的值
print('取第一列的值')
print(data_new[0])

'''
取第一列的值
0     12
1     12
2     15
3     10
4      1
5     20
6      7
7     20
8     17
9      6
10     1
11     3
12    13
13     4
14     9
15     6
16     9
17    16
18     9
19    19
20    20
21    10
22    14
23    14
24     2
25     9
26    16
27     8
28     6
29    18
      ..
70     5
71    11
72    13
73     2
74     3
75     1
76    16
77    15
78    18
79    20
80    15
81     3
82     9
83    15
84    12
85    16
86     2
87    10
88     6
89    16
90    12
91    16
92     3
93    11
94    13
95     2
96     3
97     2
98     3
99    20
Name: 0, Length: 100, dtype: int32

'''

第五步:通过value_counts()对第四步数据进行处理,得出数值与频数的对应关系表,如下

#注意value_counts函数统计一个series上的数据情况
data_new=data_new[0].value_counts()
data_new=data_new.sort_index()
print('绘制DataFrame数组第一列中数值与频率的对应关系柱状图')
print(data_new)

'''
(数值) (频数)
1      5
2      7
3     12
4      4
5      2
6      6
7      1
8      4
9      5
10     5
11     3
12     4
13     5
14     4
15     6
16     7
17     3
18     3
19     6
20     8
Name: 0, dtype: int64

'''

第六步:利用plt.hist()绘制柱状图

通过DataFrame绘制第一列,数据——频率柱状图

#通过DataFrame绘制第一列,数据——频率柱状图
print('根据上面的data_new,绘制第一列数据与频率的柱状图')
plt.hist(data_new,bins=20)   #bins指柱状图的柱数默认是10
plt.show()

通过DataFrame绘制第一列,数据——频率柱状图

#通过Numpy绘制每一行,数据——频率柱状图(横轴:数据 纵轴:频数)
print('绘制Numpy,data[0]第一行数据与频率的柱状图')
plt.hist(data[0])
plt.show()

 

posted @ 2018-12-06 16:24  yangzhizong  阅读(6462)  评论(0编辑  收藏  举报