matplotlib学习(一) —— 绘制折线图、直方图、散点图、堆叠图和饼图

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()

在上面的代码中,我们使用了xlabelylabel来设置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 matplotlib.pyplot as plt

x = [1,2,3,4,5,6,7,8,9]
y = [5,2,4,2,1,4,5,2,3]

plt.scatter(x, y, label="skitscat", color="#ffaaaa", 
	s=100, 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数据可视化

猜你喜欢

转载自blog.csdn.net/qq_41140138/article/details/100980196