matplotlib包含了很多数据可视化的模块,每个模块包含了很多绘图使用的API,可参考[matplotlib官网],(https://matplotlib.org/index.html)首先使用pyplot模块来进行简单的绘制。
首先了解一下pyplot.plot()函数的API定义:
matplotlib.pyplot.plot(*args, scalex=True, scaley=True, data=None, **kwargs)[source]
从这里开始:
import matplotlib.pyplot as plt
x = [1,2,3]
y = [5,7,4]
x2 = [1,2,3]
y2 = [10,14,12]
接着画出线条:
plt.plot(x, y, label="First Line")
plt.plot(x2, y2, label="Second Line")
设置坐标轴名称、图形名称、设置标签并显示绘图结果:
plt.xlabel("Plot Number")
plt.ylabel("Important var")
plt.title("Interesting Graph")
plt.legend()
plt.show()
在上面的代码中,我们使用了xlabel
和ylabel
来设置x、y坐标轴的名称,使用plt.title
创建标题,使用plt.legend()
生成默认图例,结果如下:
绘制直方图,我们使用hist()函数,首先了解一下matplotlib.pyplot.hist()函数的API定义:
matplotlib.pyplot.hist(x, bins=None, range=None, density=None, weights=None, cumulative=False,
bottom=None, histtype='bar', align='mid', orientation='vertical', rwidth=None, log=False,
color=None, label=None, stacked=False, normed=None, *, data=None, **kwargs)
比较常用的几个参数及其使用方法如下:
argument | description |
---|---|
x | 一个数组,表示了每一个对象的数值大小 |
label | 字符串类型,表示绘图的标签 |
bins | 一个表示容器的列表,如[1,2,3,4]包含[1,2), [2,3), [3,4] |
density | bool类型,为True时表示将统计结果归一化,及所有bin的纵坐标和为1 |
bottom | x轴的参考位置,默认值为0,如x轴可以放在y=1的位置 |
align | 默认值为"mid"表示“棒”在bin中的位置,还可取"left",“right” |
orientation | 默认为"vertical",表示竖直放置,还可以取"horizontal" |
log | 默认值为False,若为True,则将过滤掉空的bin |
color | 表示绘图的颜色,可使用""#ffffff 格式,也可以使用"lightblue"的格式 |
rwidth | 表示条形图的宽度,默认为None,若设置为0.8,则条形图宽度为bin的0.8倍 |
histtype | 默认为bar,表示直方图,还可以取"step"和stepfilled" |
我们画一个人口年龄分布的直方图:
# 绘制直方图
import matplotlib.pyplot as plt
population_age = [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 = [10*i for i in range(14)]
plt.hist(population_age, bins,bottom=0, density=True, histtype="bar", align="mid",
log=True, orientation="vertical", color="lightblue", label="bar")
plt.xlabel("age")
plt.ylabel("amount")
plt.title("Age and Population")
plt.legend()
plt.show()
此外,我们还可以直接使用 pyplot.bar()
函数来绘制直方图:
先看看pyplot.bar()的API定义:
matplotlib.pyplot.bar(x, height, width=0.8, bottom=None, *,
align='center', data=None, **kwargs)
x
为横坐标,height
表示横坐标对应的取值
align
有"center"和"edge"两种取值,
color
为填充颜色,edgecolor
为边框颜色
举个栗子:
import matplotlib.pyplot as plt
x1 = [1,3,5,7,9]
height1 = [5,2,7,6,8]
x2 = [2,4,6,8,10]
height2 = [8,6,7,2,4]
plt.bar(x1, height1, label="Example One", color="lightgreen",edgecolor="black", width=0.8, align="center")
plt.bar(x2, height2, label="Example Two", color="lightblue", edgecolor="black", width=0.8, align="center")
plt.xlabel("x coordinate")
plt.ylabel("y coordinate")
plt.title("Epic Graph")
plt.legend()
plt.show()
接下来,我们使用 pyplot.scatter()
绘制散点图,下面是API定义:
matplotlib.pyplot.scatter(x, y, s=None, c=None, marker=None, cmap=None, norm=None,
vmin=None, vmax=None, alpha=None, linewidths=None, verts=None, edgecolors=None,
*, plotnonfinite=False, data=None, **kwargs)
常用参数描述:
arguments | description |
---|---|
x, y | 列表类型,表示点的x, y坐标 |
s | 绘制图标的大小size |
color | 填充图标marker的颜色 |
marker | 图标样式,默认为”o“表示圆点,也可以使用其他的marker |
linewidth | marker边缘的宽度,默认值为0 |
edgecolor | marker边缘edge的颜色 |
示例代码:
import random
import matplotlib.pyplot as plt
x = [1,2,3,4,5,6,7,8,9]
y = [5,2,4,2,1,4,5,2,3]
areas = [1000*random.random() for i in range(len(x))]
print(areas)
plt.scatter(x, y, label="skitscat", color="#ffaaaa",
s=areas, marker="*", alpha=1.0, linewidth=0.1, edgecolor="r")
plt.xlabel("x")
plt.ylabel("y")
plt.title("Points")
plt.legend()
plt.show()
堆叠图可以反应不同情况下,各个部分占整体的比例的变化情况。比如我们一天24小时的安排情况,下面我们使用 stackplot
绘制堆叠图。
还是先看函数 stackplot()
定义:
matplotlib.pyplot.stackplot(x, *args, labels=(), colors=None, baseline='zero', data=None, **kwargs)[source]
参数不多,含义如下:
arguments | description |
---|---|
x | 横坐标,一维的列表类型 |
y | y可以由多个一维的列表构成,如y1, y2, y3… |
labels | 长度为N的字符串列表 |
colors | 长度为N的字符串列表 |
下面绘制一个每天24小时安排的饼状图:
import matplotlib.pyplot as plt
days = [1, 2, 3, 4, 5]
sleeping = [7,8,6,11,7]
eatting = [2,3,4,3,2]
working = [7,8,7,2,2]
playing = [8,5,7,8,13]
plt.stackplot(days, sleeping, eatting, working,
playing, colors=["m", "c", "r", "k"],
labels=["sleeping", "eatting", "working", "playing"])
plt.xlabel("day")
plt.ylabel("hours")
plt.title("Time")
plt.legend()
plt.show()
在上面的代码中,x
就是days,y
就是sleeping, eatting, working和playing,绘制结果如下:
为了表示每个部分所占比例,我们可以使用饼图,在matplotlib中,可以使用 pyplot.pie()
绘制饼图,先看pie()
定义:
matplotlib.pyplot.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, *, data=None)
常用参数及其描述:
arguments | description |
---|---|
x | 每个部分的数值(比例) |
explode | N元组类型,表示每一个部分扇形的偏移位置 |
labels | 由字符串组成的N元字符串 |
colors | 有字符串组成的N元字符串 |
autopic | 字符串类型,autopct="%1.1f%%"时显示比例 |
shadow | bool型,为True时绘制阴影 |
startangle | 绘制饼图的起始角度,逆时针 |
举个栗子:
import matplotlib.pyplot as plt
factors = [15, 30, 45, 10]
labels = ["Frogs", "Hogs", "Dogs", "Logs"]
kwargs = dict(labels=labels,startangle=90,radius=0.8,
shadow=True,explode=(0,0.1,0,0),autopct="%1.1f%%")
plt.pie(factors, **kwargs)
plt.title("Pie")
plt.show()
参考内容:matplotlib数据可视化