matplotlib画图总结

本文详细介绍了在Matplotlib中如何创建和布局子图,包括一般化子图布局、子图间坐标轴共用、不规则多行多列子图的绘制,以及在统计分析中子图的实际应用案例。

有时候我们需要从多个角度进行数据的比较、分析,因此就需要用到子图。子图的本质是在一个较大的图形中同时放置一组较小的坐标轴,布局形式可以多种多样,不拘泥于我们在第五集中举的那种网格图的形式。
我们先进行一般化的子图布局。

首先要创建各个子图的坐标轴,传入一个四元列表参数:[x,y,width,height],用来表示这个子图坐标轴原点的x坐标、y坐标,以及宽和高。值得注意的是,这四个值的取值范围都是[0,1],我们约定整个大图的左下端为原点(0,0),右上端为(1,1)。那么x,y的取值就表示该子图坐标原点的横坐标值和纵坐标值占大图整个长宽的比例。而width和height则表示子图的宽和高占整个大图的宽和高的比例。如果不传入参数则表示选取默认坐标轴,即大图的坐标轴。

import numpy as np
import matplotlib.pyplot as plt

ax1 = plt.axes()  
ax2 = plt.axes([0.5, 0.6, 0.15, 0.25])
plt.show()

在这里插入图片描述

下一步,我们就要在子图中进行绘图了,每生成一个子图坐标系,plt就表示当前的子图,调用plt.plot就是在当前的子图上进行绘图。

import numpy as np
import matplotlib.pyplot as plt

x = np.linspace(0, 10)
plt.axes([0.1, 0.5, 0.8, 0.4], ylim=(-1.2, 1.2))
plt.grid(True)
plt.plot(np.sin(x))

plt.axes([0.1, 0.1, 0.8, 0.4], ylim=(-1.2, 1.2))
plt.grid(True)
plt.plot(np.cos(x))
plt.show()

在这里插入图片描述
这时候,我们很自然的回忆起我们在第五集中所使用的plt.subplot方法,和上面有所不同的是,subplot方法无法绘制比例自定义的子图,而是只能创建彼此对齐的行列网格子图,如果仅仅是这种需求的话,倒是使用起来非常简便:

import numpy as np
import matplotlib.pyplot as plt

plt.subplots_adjust(hspace=0.3, wspace=0.3)
for i in range(1,7):
    plt.subplot(2,3,i)
    plt.text(0.5,0.5,str((2,3,i)),fontsize=18,ha='center')
plt.show()

在这里插入图片描述这个用法非常简单和直观,着重说一下plt.subplots_adjust这个方法,他设置了子图之间的纵、横两方向上的间隙,然后子图中的文本就是他的编号规则。

但是有没有一种感觉,就是这里面的子图显得非常拥挤,因为每个子图都有自己的一套独立的坐标轴,如果这些子图的坐标轴的取值都是一样的,那我们能否让他们同方向上公用,用以简化图形的描述呢,当然可以。

我们下面介绍子图间坐标轴的共用。

import numpy as np
import matplotlib.pyplot as plt

fig, ax = plt.subplots(2,3,sharex='col',sharey='row')
print(ax)
plt.show()

在这里插入图片描述
从图中,我们看出,同方向上重复的坐标轴已经省去,画面简洁而清爽,同时我们可以看出plt.subplots的返回值是一个二维数组,内含子图的坐标轴,我们可以进行引用,利用坐标轴对象也可以在当前子图上进行同样的绘图操作。

import numpy as np
import matplotlib.pyplot as plt

fig, ax = plt.subplots(2,3,sharex='col',sharey='row')
for i in range(2):
    for j in range(3):
        ax[i,j].text(0.5,0.5,str((i,j)),fontsize=18,ha='center')
plt.show()

在这里插入图片描述如果我们想实现一种不规则的多行多列子图,该怎么办?

这是就要利用GridSpec方法了。

import numpy as np
import matplotlib.pyplot as plt

grid = plt.GridSpec(2, 3, wspace=0.5, hspace=0.5)
plt.subplot(grid[0,0])
plt.subplot(grid[0,1:3])
plt.subplot(grid[1,0:2])
plt.subplot(grid[1,2])

plt.show()

在这里插入图片描述我们来简单的介绍一下这个图的画法,我们得到一个长×宽为2×3的grid区域,这个grid的原点是左上角,第一行第一列的子图占据grid的第0个长度,第0个宽度;第一行第二列子图占据grid的第0个长度,第1和第2个宽度(因此用分片1:3来表示),其他的以此类推。这样我们就能画出我们自定义位置和大小的子图(不过注意,其长和宽都是grid单位的整数倍)

最后,基于这种画法,我们举一个实际的例子。我们考虑在一个子图中画出二元正态分布的联合分布图,而在另两个子图中分别画出x轴和y轴方向上的边缘分布图。

import numpy as np
import matplotlib.pyplot as plt

mean = [0, 0]
cov = [[1, 1], [1, 4]]
x, y = np.random.multivariate_normal(mean, cov, 3000).T
plt.figure(figsize=(6,6))
grid = plt.GridSpec(4, 4, wspace=0.5, hspace=0.5)

main_ax = plt.subplot(grid[0:3,1:4])
plt.plot(x,y,'ok',markersize=3,alpha=0.2)

y_hist = plt.subplot(grid[0:3,0],xticklabels=[],sharey=main_ax)#和大子图共y轴
plt.hist(y,60,orientation='horizontal',color='gray')#图形水平绘制
y_hist.invert_xaxis()#x轴调换方向

x_hist = plt.subplot(grid[3,1:4],yticklabels=[],sharex=main_ax)#和大子图共x轴
plt.hist(x,60,orientation='vertical', color='gray')#图形垂直绘制
x_hist.invert_yaxis()#y轴调换方向

plt.show()

在这里插入图片描述在最大的子图中,我们通过散点图,绘制了联合分布情况,而两个小的子图,通过频次直方图绘制了边缘分布。这种图在统计分析上非常有用。

### 如何设置 Matplotlib 生成图表的尺寸 在 Matplotlib 中,可以通过多种方式来调整生成图表的尺寸。以下是具体方法及其说明: #### 使用 `Figure` 对象的参数 `figsize` 当创建一个新的 Figure(画布)对象时,可以直接通过 `figsize` 参数指定其尺寸。该参数接受一个元组 `(width, height)`,单位为英寸。 ```python import matplotlib.pyplot as plt # 创建一个宽度为8英寸、高度为6英寸的画布 fig = plt.figure(figsize=(8, 6)) plt.plot([1, 2, 3], [4, 5, 6]) plt.show() ``` 上述代码中的 `figsize=(8, 6)` 表示生成的图表宽为8英寸,高为6英寸[^5]。 --- #### 动态修改图表尺寸 如果已经创建了一个 Figure 对象,也可以动态地更改其尺寸。这可以通过 `set_figwidth` 和 `set_figheight` 方法实现。 ```python fig = plt.figure() # 修改宽度和高度 fig.set_figwidth(10) # 宽度设为10英寸 fig.set_figheight(5) # 高度设为5英寸 plt.plot([1, 2, 3], [4, 5, 6]) plt.show() ``` 这里分别使用了 `set_figwidth` 和 `set_figheight` 来单独调整宽度和高度[^1]。 --- #### 获取当前图表尺寸 为了验证或调试图表尺寸,可以使用 `get_size_inches` 方法获取当前图表的实际尺寸。 ```python fig = plt.figure(figsize=(6, 4)) print(fig.get_size_inches()) # 输出: [6. 4.] ``` 此方法返回的是一个 NumPy 数组,表示当前图表的宽度和高度(单位为英寸)。它可以帮助开发者确认所设定的尺寸是否生效。 --- #### 调整 DPI 影响实际显示效果 除了设置 `figsize` 外,DPI(每英寸点数)也会影响最终渲染的效果。默认情况下,Matplotlib 的 DPI 是 100。如果希望提高分辨率或者改变输出文件的质量,可以调整这个值。 ```python fig = plt.figure(figsize=(6, 4), dpi=200) plt.plot([1, 2, 3], [4, 5, 6]) plt.savefig('high_res_plot.png') # 保存为高质量图片 plt.show() ``` 在此例子中,虽然 `figsize` 不变,但由于设置了更高的 DPI 值 (200),因此生成的图像更加清晰。 --- #### 自定义字体和其他细节配合整体设计 对于更复杂的场景,可能还需要同步调整其他元素的比例关系,比如坐标轴标签文字大小、图例位置等。下面是一个综合案例展示如何协调各部分样式以匹配新的图表尺寸。 ```python import numpy as np import matplotlib.pyplot as plt font_style = {'family': 'serif', 'color': 'darkred', 'weight': 'normal', 'size': 16} x = np.linspace(0, 10, 100) y = np.sin(x) fig = plt.figure(figsize=(12, 8)) # 更大一些的画布 ax = fig.add_subplot(111) ax.plot(x, y, label='Sine Wave') ax.set_title('A Sine Curve Example', fontsize=20) ax.set_xlabel('X Axis Label', fontdict=font_style) ax.set_ylabel('Y Axis Label', fontdict=font_style) ax.legend(prop={'size': 14}) ax.tick_params(axis='both', which='major', labelsize=14) plt.tight_layout() # 确保不会重叠 plt.show() ``` 这段脚本不仅改变了整个窗口大小,还重新配置了一些附属组件如标题字型大小以及刻度标注风格等内容[^4]。 --- ### 总结 以上介绍了几种常见的用于控制 Matplotlib 图表尺寸的方法,包括初始化阶段利用 `figsize` 参数直接声明期望规格;运行期间借助 API 函数灵活变更现有实例属性;最后考虑附加因素像像素密度影响视觉呈现质量等问题。合理运用这些技术能够帮助我们制作出既美观又实用的数据可视化作品。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值