优秀的编程知识分享平台

网站首页 > 技术文章 正文

走进Matplotlib世界(六)(matplotlib 官网)

nanyue 2024-10-14 11:32:46 技术文章 9 ℃

回顾

在走进Matplotlib世界(五)中,我们介绍了Matplotlib中的几种基本图表,包括线状图、柱状图、直方图和密度图的概念和用法。今天我们继续来看另外几种基本图表类型:面积图、柱状图和饼图。

面积图

面积图又称为区域图,强调数量随时间而变化的程度,也可用于引起人们对总值趋势的注意。堆积面积图和百分比堆积面积图还可以显示部分与整体的关系。Matplotlib中,使用area()方法创建面积图,基本用法如下。?

# 0、导入包
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
# 1、准备数据
data = pd.DataFrame(np.random.rand(10, 5), columns=list('abcde'))
# 2、创建图像
fig = plt.figure(figsize=(4, 4), facecolor=(0, 1, 0, 1))
# 3、绘图
ax = fig.add_subplot(111)
data.plot.area(ax=ax) # colormap='Greens_r'
# 4、自定义设置
ax.set_title("area")
ax.set_xlim(0, 8)
ax.set_ylim(0, 4)
# 5、保存图形(按需要使用)
# plt.savefig(‘xxx.png’)
# 6、显示图形
plt.show()

运行结果如下,由于没有设置颜色,每个图形呈现的颜色是随机的,设置色系可使用colormap属性。在Matplotlib中,面积图默认是堆叠的,即stacked值默认为True。

若不想堆叠显示,可以将stacked值设为False。?

# 0、导入包
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
# 1、准备数据
data = pd.DataFrame(np.random.rand(10, 5), columns=list('abcde'))
# 2、创建图像
fig = plt.figure(figsize=(4, 4), facecolor=(0, 1, 0, 1))
# 3、绘图
ax = fig.add_subplot(111)
data.plot.area(ax=ax, stacked=False)
# 4、自定义设置
ax.set_title("area")
ax.set_xlim(0, 8)
ax.set_ylim(0, 1)
# 5、保存图形(按需要使用)
# plt.savefig(‘xxx.png’)
# 6、显示图形
plt.show()

设置面积图不堆叠后,呈现效果跟下面讲到的填充图的重叠很像,运行效果如下图所示。

填充图

填充图用于基本图表的填充,分为多边形填充(简单来说,就是填充函数和坐标轴之间的区域)和函数间区域填充。Matplotlib中,分别用fill(*args, **kwargs)和fill_between()来实现多边形填充和函数间区域填充。

多边形填充fill(*args, **kwargs)中,args参数是x, y的序列,以及可选的color参数。kwargs是图形的可选属性参数,例如标签label,透明度alpha等。用法如下。?

# 0、导入包
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
# 1、准备数据
x = np.linspace(0, 1, 1000)
y1 = np.sin(3 * np.pi * x) * np.exp(2 * x)
y2 = -np.sin(3 * np.pi * x) * np.exp(2 * x)
# 2、创建图像
fig, axes = plt.subplots(2, 2, figsize=(8, 8), facecolor=(0, 1, 0, 1))
# 3、绘图
ax1 = axes[0, 0]
ax2 = axes[0, 1]
ax3 = axes[1, 0]
ax4 = axes[1, 1]
ax1.fill(x, y1, label='y1')
ax2.fill(x, y2, 'r', alpha=0.5, label='y2')
ax3.fill(x, y1, x, y2)
ax4.fill(x, y1, 'r', x, y2, 'b')
# 4、自定义设置
ax1.set_title("No.1")
ax1.legend(loc=0)
ax2.set_title("No.2")
ax2.legend(loc=2)
ax3.set_title("No.3")
ax4.set_title("No.4")
plt.subplots_adjust(wspace=0.1, hspace=0.3)
# 5、保存图形(按需要使用)
# plt.savefig(‘xxx.png’)
# 6、显示图形
plt.show()

上述代码创建了4个填充图,分别是使用默认颜色填充一个图形 ,使用红色填充一个图形,使用默认颜色填充两个图形,使用红色和蓝色填充两个图形。运行结果如下。

当图形多于一个时添加图例,我们可以使用两次fill()方法,分别设置对应的图例名称。?

# 0、导入包
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
# 1、准备数据
x = np.linspace(0, 1, 1000)
y1 = np.sin(3 * np.pi * x) * np.exp(2 * x)
y2 = -np.sin(3 * np.pi * x) * np.exp(2 * x)
# 2、创建图像
fig = plt.figure(figsize=(4, 4), facecolor=(0, 1, 0, 1))
# 3、绘图
ax = fig.add_subplot(111)
ax.fill(x, y1, 'r', label='y1')
ax.fill(x, y2, 'b', label='y2')
# 4、自定义设置
ax.legend(loc=2)
# 5、保存图形(按需要使用)
# plt.savefig(‘xxx.png’)
# 6、显示图形
plt.show()

运行效果如下。

当图形之间有重叠时,填充图的呈现效果就类似于不堆叠的面积图。我们在上述代码的基础上再添加一个填充图,为了便于观察重叠部分,我们将y3的透明度值设置成0.5。?

# 0、导入包
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
# 1、准备数据
x = np.linspace(0, 1, 1000)
y1 = np.sin(3 * np.pi * x) * np.exp(2 * x)
y2 = -np.sin(3 * np.pi * x) * np.exp(2 * x)
y3 = -np.sin(2 * np.pi * x) * np.exp(3 * x)
# 2、创建图像
fig = plt.figure(figsize=(4, 4), facecolor=(0, 1, 0, 1))
# 3、绘图
ax = fig.add_subplot(111)
ax.fill(x, y1, 'r', label='y1')
ax.fill(x, y2, 'b', label='y2')
ax.fill(x, y3, 'c', alpha=0.5, label='y3')
# 4、自定义设置
ax.legend(loc=2)
# 5、保存图形(按需要使用)
# plt.savefig(‘xxx.png’)
# 6、显示图形
plt.show()

运行效果如下,可以看到基本与不设置堆叠的面积图一样,重叠部分的颜色效果是由重叠的各个图形颜色叠加生成。

函数间区域填充fill_between()常用的参数包括x, y1, y2, where等。x, y1, y2分别表示了两条曲线,where是条件表达式,可以排除一些不想被包括的区域。此外,还可以传入可选的属性参数。fill_between基本用法如下。?

# 0、导入包
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
# 1、准备数据
x = np.linspace(0, 1, 1000)
y1 = -np.sin(3 * np.pi * x) * np.exp(2 * x)
y2 = -np.sin(2 * np.pi * x) * np.exp(3 * x)
# 2、创建图像
fig = plt.figure(figsize=(4, 4), facecolor=(0, 1, 0, 1))
# 3、绘图
ax = fig.add_subplot(111)
ax.fill_between(x, y1, y2, facecolor="b")
# 4、自定义设置
# 5、保存图形(按需要使用)
# plt.savefig(‘xxx.png’)
# 6、显示图形
plt.show()

运行结果如下图所示。

饼图

饼图是显示一个数据系列中各项数据的大小与各项数据总和的比例的一种图表。饼图中的数据点显示为整个饼图的百分比。Matplotlib中,饼图使用pie()方法实现。pie()的参数包括x, explode, labels, colors, autopct, pctdistance, shadow, labeldistance, startangle, radius, counterclock, wedgeprops, textprops, center, frame, rotatelabels。

各参数意义:x是绘制饼图所用的数据。explode是每部分相对于半径的偏移量。labels是每部分标签的字符串序列。colors是饼图循环使用的颜色参数序列。autopct是饼图上的标签显示方式。pctdistance是每个饼图切片的中心与通过autopct生成的文本开始之间的比例。shadow可以设置在饼图下画一个阴影。labeldistance是饼图标签的径向距离。startangle是开始角度(从X轴逆时针旋转饼图的起点角度)。radius是饼图的半径,默认为1。counterclock指定顺时针或逆时针。wedgeprops是传递给饼图对象的参数字典。textprops是传递给文本对象的参数的dict。center设置图表的中心位置。frame为True使用图表绘制轴框架。rotatelabels为True将每个标签旋转到相应切片的角度。

绘制数据x的饼图。每个楔块的分数区域由x/sum(x)给出。如果sum(x)<1,则x的值将直接给出分数区域,且数据x将不规范化,生成的饼图将有一个大小为1-x/sum(x)的空楔块。我们分别绘制sum(x)>1和sum(x)<1两种情况下的饼图,为了比较一些属性,第二个饼图我们取消偏移量,同时设置成顺时针方向。?

# 0、导入包
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
# 1、准备数据
data1 = pd.Series(3 * np.random.rand(4), index=list('abcd'), name='index')
data2 = [0.15, 0.30, 0.25, 0.10]
# 2、创建图像
fig, axes = plt.subplots(1, 2, figsize=(5, 5), facecolor=(0, 1, 0, 1))
# 3、绘图
ax1 = axes[0]
ax1.pie(data1, explode=[0.1, 0, 0, 0], labels=data.index, 
 colors=['r', 'g', 'b', 'c'], autopct='%.2f%%', 
 pctdistance=0.6, labeldistance=1.1, 
 shadow=True, startangle=0, radius=1.5, frame=False)
ax2 = axes[1]
ax2.pie(data2, labels=data.index, colors=['r', 'g', 'b', 'c'], 
 autopct='%.2f%%', pctdistance=0.6, labeldistance=1.1, 
 counterclock=False, shadow=True, startangle=0, radius=1.5, frame=False)
# 4、自定义设置
ax1.set_title("Pie1")
ax2.set_title("Pie2")
plt.subplots_adjust(wspace=0.5)
# 5、保存图形(按需要使用)
# plt.savefig(‘xxx.png’)
# 6、显示图形
plt.show()

运行效果如下图所示,可以看到, 第二个饼图由于sum(x)<1,不再以x/sum(x)给出每部分,而是直接用了x的值,并且会空出一块。

饼图还可以进行嵌套,即嵌套饼图。在这种情况下,饼图采用与组中的计数相对应的值。我们首先生成一些对应于三个组的假数据,在外环中,我们将它们绘制为原始3个组的成员,然后在内环中,我们把每个数字视为属于自己的组。 用法如下。?

# 0、导入包
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
# 1、准备数据
size = 0.3
vals = np.array([[60., 32.], [37., 40.], [29., 10.]])
cmap = plt.get_cmap("tab20c")
outer_colors = cmap(np.arange(3)*4)
inner_colors = cmap(np.array([1, 2, 5, 6, 9, 10]))
# 2、创建图像
fig, ax = plt.subplots(1, 1, figsize=(6, 6), facecolor=(0, 1, 0, 1))
# 3、绘图
ax.pie(vals.sum(axis=1), radius=1+size, colors=outer_colors, autopct='%.2f%%',
 wedgeprops=dict(width=size, edgecolor='w'))
ax.pie(vals.flatten(), radius=1-size, colors=inner_colors, autopct='%.2f%%',
 wedgeprops=dict(width=size, edgecolor='w'))
# 4、自定义设置
ax.set(aspect="equal", title='Pie plot with `ax.pie`')
# 5、保存图形(按需要使用)
# plt.savefig(‘xxx.png’)
# 6、显示图形
plt.show()

为了便于比较,我们将外环的radius设置成1.3,将内环的radius设置成0.7。这里利用了numpy数组的sum()方法和flatten()方法,sum()设置axis=1对行方向上求和,得到外环的数据,flatten()方法将二维数组降成一维得到内环的数据。运行结果如下图所示。

图表的基本类型种类繁多,下次我们再讨论其他类型的图表。

?

?

Tags:

最近发表
标签列表