Matplotlib简单教程

Matplotlib简单教程

绘图简介

使用matplotlib库绘图,原理很简单,就是下面这5步:

  • 创建一个图纸 (figure)
  • 在图纸上创建一个或多个绘图(plotting)区域(也叫子图,坐标系/轴,axes)
  • 在plotting区域上描绘点、线等各种marker
  • 为plotting添加修饰标签(绘图线上的或坐标轴上的)
  • 其他各种DIY

上述的过程主要分为3个方面:

  • 变量
  • 函数
  • 图纸(figure)和子图(axes)
  • 其中,变量和函数通过改变figure和axes中的元素(例如:title,label,点和线等等)一起描述figure和axes,也就是在画布上绘图。结构如下:
Matplotlib简单教程_第1张图片
e421081632ff032d4abae155b6c60e3.png

plot绘制绘制坐标

plt.plot(x, y, format_string, **kwargs)

说明:

  • x, y:分别是x,y轴的数据,可以是列表,参数x是可选的,而y是必要的
  • fromat_string:控制曲线格式的字符串,可选
  • **kwargs:第二组或更多的(x, y, format_string)

首先绘制一张简单的图

import matplotlib.pyplot as plt

plt.plot([1,2,3,4])
plt.xlabel('some x numbers')
plt.ylabel('some y numbers')
plt.title('a straight line')
plt.show()

绘图的结果如下图所示:

Matplotlib简单教程_第2张图片
cd70c40e004ab1e576ae1cebe2fb4e0.png

解释

可见,绘制一个简单的图,只需要原理中的第3,4步就行了。

主要看第3行的代码,plt.plot()函数可以接受很多参数,第一、二个是x, y轴的坐标,之后还会有绘图线的颜色和类型。函数中我们只给出了一个列表,所以matplotlib默认给出的是y,然后自动生成x。

下面我们传入多个列表,并且添加描绘线的类型和颜色的部分

import matplotlib.pyplot as plt
import numpy as np

a = np.arange(10)
plt.plot(a, a*1.5, 'go-', label='Firstline')
plt.plot(a, a*2.5, 'rx', label="Secondline")
plt.plot(a, a*3.5, '*', label="Thirdline")
plt.plot(a, a*4.5, 'b-.', label="Fourthline")
plt.title('using_format_string')
plt.xlabel('some x numbers')
plt.ylabel('some y numbers')
plt.legend()
plt.show()

结果如下:


Matplotlib简单教程_第3张图片
1521697329(1).png

上面的程序中,我们在每一组数据的后面加上了控制曲线格式字符串,由颜色、字符风格和标记字符组成。

支持的color

character color character color
'b' blue 'm' magenta
'g' green 'y' yellow
'r' red 'k' black
'c' cyan 'w' white
'#xxxxxx' RGB '0.8' gray level

支持的line style:

标记字符 说明 标记字符 说明
'.' 'D' 菱形
',' 像素(极小点) 'd' 瘦菱形
'o' 实心圈 '|' 竖直线
'v' 倒三角 '1' 下花三角
'^' 上三角 '2' 上花三角
'>' 右三角 '3' 左花三角
'<' 左三角 '4' 右花三角
'h' 竖六边形 's' 实心方形
'H' 横六边形 'p' 实心五角
'+' 十字 '*' 星型
'x' x标记
风格字符 说明
'-' 实线
'--' 波折线
'-.' 点折线
':' 虚线
‘’ 无线条

上述程序中我们为每一条线指定了一个label,并且用plt.legend()指定生成图例。

另外,我们不仅可以用字符串一次性指定多个属性,也可以分别为每个属性赋值。

  • color:控制颜色,color=’green’
  • linestyle:线条风格,linestyle=’dashed’
  • marker:标记风格,marker = ‘o’
  • markerfacecolor:标记颜色,markerfacecolor = ‘blue’
  • markersize:标记尺寸,markersize = ‘20’
  • linewidth:线宽:linewidth=2.0

例如:

import matplotlib.pyplot as plt
import numpy as np

a = np.arange(10)
plt.plot(a, a**2, color='green', linestyle='dashed', marker='o', markerfacecolor='blue', markersize='10',linewith=2.0)
plt.title('using_format_string')
plt.xlabel('some x numbers')
plt.ylabel('some y numbers')
plt.legend()
plt.show()

结果如下:


Matplotlib简单教程_第4张图片
b6bf4f0e41c5cf79bc5c522f4465f0e.png

多图多axes

MATLAB和plt1都有当前figure和axes的概念
也就是说,通过plt 进行的操作都是对当前图或子图进行的,所有的绘图命令都是针对当前figure和axes的.如果figure()和subplot()没有定义的话,都默认为figure(1)和subplot(111)。

plt.figure(i):表示当前对第几块画布进行操作

plt.subplot(nrows, ncols, plot_number):把一个绘图区域(可以理解成画布)分成多个小区域,用来绘制多个子图。

nrows和ncols表示将画布分成(nrows*ncols)个小区域,每个小区域可以单独绘制图形;plot_number表示将图绘制在第plot_number个子区域。

import matplotlib.pyplot as plt
import numpy as np

a = np.arange(10)
plt.figure(1)
plt.subplot(221)
plt.plot(a, a, 'ro-')
plt.subplot(222)
plt.plot(a, a**2, 'go-')
plt.subplot(223)
plt.plot(a, a**3, 'bo-')
plt.subplot(224)
plt.plot(a, a**2, 'yo-')
plt.legend()
plt.show()

运行结果:


Matplotlib简单教程_第5张图片
d3728dfc7bbdee61b2c2a9c4cbd1db8.png

条形图和直方图

有了plt.plot()的基础之后,对后面的直方图和饼状图的理解就很容易了。

直接上例子:

import matplotlib.pyplot as plt

plt.bar([1, 3, 5, 7, 9], [5, 2, 7, 8, 2], label="Example one")
plt.bar([2, 4, 6, 8, 10], [8, 6, 2, 5, 6], label="Example two", color='g')
plt.legend()
plt.xlabel('bar number')
plt.ylabel('bar height')

plt.title('Epic Graph\nAnother Line!')

plt.show()

运行结果如下:


Matplotlib简单教程_第6张图片
bb26bcae769a810117a791fd147af9e.png

plt..bar()中参数的总结,转:http://blog.csdn.net/claroja/article/details/72912791?utm_source=itdadao&utm_medium=referral

接下来我们尝试添加一些属性信息:

from matplotlib import pyplot as plt
import numpy as np

# 第一步,取出一张白纸
fig = plt.figure(1)
# 第二步,确定绘图范围,由于只需要画一张图,所以我们将整张白纸作为绘图的范围
ax1 = plt.subplot(111)
# 第三步,整理我们准备绘制的数据
data = np.array([15, 20, 18, 25])
# 第四步,准备绘制条形图,思考绘制条形图需要确定那些要素
# 1、绘制的条形宽度
# 2、绘制的条形位置(中心)
# 3、条形图的高度(数据值)
width = 0.5
x_bar = np.arange(4)
# 第五步,绘制条形图的主体,条形图实质上就是一系列的矩形元素,我们通过plt.bar函数来绘制条形图
rect = ax1.bar(left=x_bar, height=data, width=width, color="lightblue", alpha=0.8, align='center')
# 第六步,向各条形上添加数据标签
for rec in rect:
    x = rec.get_x()
    height = rec.get_height()
    ax1.text(x+0.1,1.02*height,str(height))
# 第七步,绘制x,y坐标轴刻度及标签,标题
xtickLabels = ('first', 'second', 'third', 'fourth')
ax1.set_xticks(x_bar)
ax1.set_xticklabels(("first", "second", "third", "fourth"), fontsize='large', rotation=30, alpha=0.8)
ax1.set_ylabel("sales")
ax1.set_title("The Sales in 2016")
ax1.grid(True)
ax1.set_ylim(0, 28)
plt.show()

运行结果如下:


Matplotlib简单教程_第7张图片
c54cfa53a29588414b1ce26b560e63d.png

接下来讲解直方图:

接下来,我们会讲解直方图。 直方图非常像条形图,倾向于通过将区段组合在一起来显示分布。 可能是年龄的分组,或测试的分数。 我们并不是显示每一组的数据,而是按照 20 ~ 25,25 ~ 30… 等等来显示数据。 这里有一个例子:

population_ages = [22, 55, 62, 45, 21, 22, 34, 42, 42, 4, 99, 102, 110, 120, 121, 122, 130, 111, 115, 112, 80, 75, 65,
                   54, 44, 43, 42, 48]
bins = [0, 10, 20, 30, 40, 50, 60, 70, 80, 90, 100, 110, 120, 130]
plt.hist(population_ages, bins, histtype='bar', rwidth=0.8)
plt.xlabel('x', fontsize='large')
plt.ylabel('y', rotation=0, fontsize='large')
plt.title('Interesting Graph\nCheck it out')
plt.legend()
plt.show()

运行结果如下:


Matplotlib简单教程_第8张图片
acaf1770a7215d9b5f616653b08ef64.png

散点图

示例代码:

import matplotlib.pyplot as plt

x = [1,2,3,4,5,6,7,8]
y = [5,2,4,2,1,4,5,2]
plt.scatter(x,y, label='skitscat', color='k', s=25, marker="o")
plt.xlabel('x')
plt.ylabel('y')
plt.title('Interesting Graph\nCheck it out')
plt.legend()
plt.show()

运行结果如下:


Matplotlib简单教程_第9张图片
4f022683d784490b4e569695a9cff1d.png

饼状图

通常,饼图用于显示部分对于整体的情况,通常以%为单位。 幸运的是,Matplotlib 会处理切片大小以及一切事情,我们只需要提供数值。

示例程序:

import matplotlib.pyplot as plt

slices = [7,2,2,13]
activities = ['sleeping','eating','working','playing']
cols = ['c','m','r','b']
plt.pie(slices,
        labels=activities,
        colors=cols,
        startangle=90,
        shadow= True,
        explode=(0,0.1,0,0),
        autopct='%1.1f%%')
plt.title('Interesting Graph\nCheck it out')
plt.show()

运行结果:


Matplotlib简单教程_第10张图片
image-20190123154113196.png

plt.pie中,我们需要指定『切片』,这是每个部分的相对大小。 然后,我们指定相应切片的颜色列表。 接下来,我们可以选择指定图形的『起始角度』。 这使你可以在任何地方开始绘图。 在我们的例子中,我们为饼图选择了 90 度角,这意味着第一个部分是一个竖直线条。 接下来,我们可以选择给绘图添加一个字符大小的阴影,然后我们甚至可以使用explode拉出一个切片。

我们总共有四个切片,所以对于explode,如果我们不想拉出任何切片,我们传入0,0,0,0。 如果我们想要拉出第一个切片,我们传入0.1,0,0,0

最后,我们使用autopct,选择将百分比放置到图表上面。

堆叠图

堆叠图用于显示『部分对整体』随时间的关系。 堆叠图基本上类似于饼图,只是随时间而变化。

让我们考虑一个情况,我们一天有 24 小时,我们想看看我们如何花费时间。 我们将我们的活动分为:睡觉,吃饭,工作和玩耍。

我们假设我们要在 5 天的时间内跟踪它,因此我们的初始数据将如下所示:

import matplotlib.pyplot as plt

days = [1, 2, 3, 4, 5]

sleeping = [7, 8, 6, 11, 7]
eating =  [2, 3, 4, 3, 2]
working = [7, 8, 7, 2, 2]
playing = [8, 5, 7, 8, 13]

因此,我们的x轴将包括day变量,即 1, 2, 3, 4 和 5。然后,日期的各个成分保存在它们各自的活动中。 像这样绘制它们:

plt.stackplot(days, sleeping, eating, working, playing, colors=['m', 'c', 'r', 'k'])

plt.xlabel('x')
plt.ylabel('y')
plt.title('Interesting Graph\nCheck it out')
plt.show()

运行结果如下:


Matplotlib简单教程_第11张图片
79a83b1380fb825a4d2039dc3004fab.png

在这里,我们可以至少在颜色上看到,我们如何花费我们的时间。 问题是,如果不回头看代码,我们不知道什么颜色是什么。 下一个问题是,对于多边形来说,我们实际上不能为数据添加『标签』。 因此,在任何不止是线条,带有像这样的填充或堆叠图的地方,我们不能以固有方式标记出特定的部分。 这不应该阻止程序员。 我们可以解决这个问题:

import matplotlib.pyplot as plt

days = [1, 2, 3, 4, 5]

sleeping = [7, 8, 6, 11, 7]
eating = [2, 3, 4, 3, 2]
working = [7, 8, 7, 2, 2]
playing = [8, 5, 7, 8, 13]


plt.plot([], [], color='m', label='Sleeping', linewidth=5)
plt.plot([], [], color='c', label='Eating', linewidth=5)
plt.plot([], [], color='r', label='Working', linewidth=5)
plt.plot([], [], color='k', label='Playing', linewidth=5)

plt.stackplot(days, sleeping, eating, working, playing, colors=['m', 'c', 'r', 'k'])

plt.xlabel('x')
plt.ylabel('y')
plt.title('Interesting Graph\nCheck it out')
plt.legend()
plt.show()

运行结果如下:


Matplotlib简单教程_第12张图片
a6d73bd871f8157639d2e87cae164c5.png

你可能感兴趣的:(Matplotlib简单教程)