python --Matplotlib详解
pip install matplotlib
import matplotlib.pyplot as plt
如果输入的是两个列表,一个表示 x 轴的值,一个表示 y 轴的值,那么就可以在直角坐标系中划出很多个点,然后将这些点用指定的线段连接起来就得到了散点图。
可以使用 plt.plot(x, y, 风格) 来达到目的,其中的风格有很多种,如点状、小叉、圆圈、不同颜色等。
import matplotlib.pyplot as plt
x = [1, 2, 3, 4]
y = [2, 4, 2, 6]
y1 = [e+1 for e in y]
y2 = [e+2 for e in y]
plt.plot(x, y, "b.") # b:蓝色,.:点
plt.plot(x, y1, "ro") # r:红色,o:圆圈
plt.plot(x, y2, "kx") # k:黑色,x:x字符(小叉)
plt.show() # 在窗口显示该图片
我们可以看到不同颜色、不同线型、不同的点的形状。
上述代码的第 9 行用来显示图片,但这并不是最好的使用方式。本章后面的部分会将产生的图片保存到 png 文件中。可以使用下面的代码来替换第 9 行的代码:
plt.savefig("demo1.png")
折线图和点状图类似,只是在风格上有所不同。我们需要指定线型,如“-”表示实线、“–”表示虚线、“-.”表示带点的虚线、“:”表示完全用点来组成的虚线。
import matplotlib.pyplot as plt
x = [1, 2, 3, 4]
y = [1, 2, 3, 4]
y1 = [e+1 for e in y] # 计算y的值
y2 = [e+2 for e in y]
y3 = [e+3 for e in y]
plt.plot(x, y, "b.-") # b:蓝色,.:点,-:线
plt.plot(x, y1, "ro--") # r:红色,o:圆圈,--:短线连接起来
plt.plot(x, y2, "kx-.") # k:黑色,x:x字符,-.:点和线
plt.plot(x, y3, "c*:") # c:蓝绿色,*:*字符,::点组成的线
plt.savefig("demo1.png") # 将图片保存到文件中
其实参数 x 是可选的,如果不填写,那么 x=[1,2,3,…]。例如上面的代码可以写成下面的样子,而含义没有任何差别;
import matplotlib.pyplot as plt
y = [1, 2, 3, 4] # 4组数据
y1 = [e+1 for e in y]
y2 = [e+2 for e in y]
y3 = [e+3 for e in y]
plt.plot(y, "b.-") # 没有x参数
plt.plot(y1, "ro--") # r:红色,o:圆圈,--:短线连接起来
plt.plot(y2, "kx-.") # k:黑色,x:x字符,-.:点和线
plt.plot(y3, "c*:") # c:蓝绿色,*:*字符,::点组成的线
plt.savefig("demo3.png")
颜色的表示法对应关系
表示法 | 颜色 |
---|---|
‘b’ | 蓝色 |
‘g’ | 绿色 |
‘r’ | 红色 |
‘c’ | 蓝绿色 |
‘m’ | 品红 |
‘y’ | 黄色 |
‘k’ | 黑色 |
点的样式对应关系
表示法 | 颜色 |
---|---|
‘o’ | 小圆圈 |
‘v’ | 朝下的三角形 |
‘^’ | 朝上的三角形 |
‘>’ | 朝右的三角形 |
‘<’ | 朝左的三角形 |
‘x’ | 叉 |
‘+’ | 加号 |
‘s’ | 方框 |
线型的样式对应关系
表示法 | 颜色 |
---|---|
‘-’ | 实线 |
‘–’ | 虚线 |
‘-.’ | 带有点的虚线 |
‘:’ | 点组成的虚线 |
柱状图和散点图类似,也是需要两个参数 x 和 y,但画出来的效果差别很大,而且需要使用 bar() 函数而不是 plot() 函数
import matplotlib.pyplot as plt
x = [1, 2, 3, 4]
y = [1, 2, 3, 4]
y1 = [e+1 for e in y]
y2 = [e+2 for e in y]
y3 = [e+3 for e in y]
plt.bar(x, y)
plt.savefig("bardemo1.png")
可以修改柱体的颜色,通过参数 color 来完成。例如将以上代码的第 7 行进行如下修改:
plt.bar(x, y, color="red")
也可以设定柱体边框的颜色,通过参数 edgecolor 来完成。例如将以上代码的第 7 行修改为:
plt.bar(x, y, color="red", edgecolor="black")
x 轴除了可以是数字信息外,也可以是其他信息。例如可以用柱状图来表示几种编程语言的受欢迎程度,代码如下:
import matplotlib.pyplot as plt
language = ('Python', 'C++', 'Java', 'Perl', 'Scala', 'Lisp')
x_pos = range(len(language)) # [0, 1, 2, 3, 4, 5, 6]
pop = [10, 8, 6, 4, 2, 1]
plt.bar(x_pos, pop, align='center', alpha=0.5)
plt.xticks(x_pos, language)
plt.ylabel('Popularity')
plt.title('Programming Language Popularity)
plt.savefig("demo4.png")
绘制水平柱状图
将柱状图中的 bar 改成 barh 即可,barh 表示 horizon bar,就是水平的柱状图。其用法和垂直的柱状图类似,下面是一个使用的例子:
import matplotlib.pyplot as plt
language = ('Python', 'C++', 'Java', 'Perl', 'Scala', 'Lisp')
x_pos = range(len(language)) # [0, 1, 2, 3, 4, 56]
pop = [10, 8, 6, 4, 2, 1]
plt.barh(x_pos, pop, align='center', alpha=0.5)
plt.yticks(x_pos, language)
plt.xlabel('Popularity')
plt.title('Programming Language Popularity')
plt.savefig("demo5.png")
可以使用 pie() 函数来画饼图。下面是最简单的饼图,表示 4 个城市的高技术产值。
import matplotlib.pyplot as plt
lbs = ["Beijing", "Shanghai", "Guangzhou", "Shenzhen"] # 标签
vals = [50, 20, 10, 20]
plt.pie(vals, labels=lbs)
plt.savefig("piedemo1.png")
也可以使用 explode 参数表示某个单元是否被切出来,以及切出来的长度。例如希望上海和广州被切出来,那么可以使用下面的代码:
import matplotlib.pyplot as plt
lbs = ["Beijing", "Shanghai", "Guangzhou", "shenzhen"] # 标签
vals = [50, 20, 10, 20]
# 0表示不切出来,否则表示切出来,值越大切出的距离越大
explode = (0, 0.1, 0.2, 0)
plt.pie(vals, explode=explode, labels=lbs)
plt.savefig("piedemo2.png")
也可以用 colors 参数来表示各个块的颜色,这也是一个字符串的列表,如下面的代码所示:
import matplotlib.pyplot as plt
lbs = ["Beijing", "Shanghai", "Guangzhou", "shenzhen"]
vals = [50, 20, 10, 20] # 值的列表
explode = (0, 0.1, 0.2, 0) # 切出的长度
color_list =['red', 'blue', 'yellow', 'gray'] # 颜色列表
plt.pie(vals, explode=explode, colors=color_list, labels=lbs) # 饼图
plt.savefig("piedemo3.png") # 保存到png文件中