首页 > 解决方案 > Matplotlib 的网格和限制问题

问题描述

我试图使用 Matplotlib 为下面给出的参数创建一个正弦波图。

创建一个宽 12 英寸,高 3 英寸的图形。将其命名为图。

使用 add_subplot 创建与图 fig 关联的轴。将其命名为斧头。

创建一个 numpy 数组 t,其中包含 200 个介于 0.0 和 2.0 之间的值。使用 'linspace' 方法生成 200 个值。

创建一个 numpy 数组 v,使得 v = np.sin(2.5 np.pi t)。

将 t 和 v 作为变量传递给绘图函数并绘制一条穿过选定 200 个点的红线。将线标记为 sin(t)。

将 X 轴标记为时间(秒)。

将 Y 轴标记为电压 (mV)。

将标题设置为正弦波。

将 X 轴上的数据限制为 0 到 2。

将 Y 轴上的数据限制在 -1 到 1 之间。

将 X 轴上的主要刻度标记为 0、0.2、0.4、0.6、0.8、1.0、1.2、1.4、1.6、1.8 和 2.0。

在 -1、0 和 1 处标记 Y 轴上的主要刻度。

添加一个网格,其线型为“--”。

添加图例。

写了下面,它几乎是按要求来的,但预期的图表与我写的略有不同。我确实给出了 x 和 y 限制,但图表似乎比这更进一步。

import numpy as np
import matplotlib.ticker as ticker
fig = plt.figure(figsize=(12,3))
ax = fig.add_subplot(111)
t = np.linspace(0.0,2.0,200)
v = np.sin(2.5*np.pi*t)
ax.set(title='Sine Wave', xlabel='time (seconds)', ylabel='Voltage (mV)', xlim = (0,2), ylim=(-1,1))
xmajor = [0, 0.2, 0.4, 0.6, 0.8, 1.0, 1.2, 1.4, 1.6, 1.8, 2.0]
ymajor = [-1,0,1]
ax.xaxis.set_major_formatter(ticker.FixedFormatter(xmajor))
ax.yaxis.set_major_formatter(ticker.FixedFormatter(ymajor))
plt.plot(t, v, label='sin(t)',color = 'red')
plt.legend()
plt.rc('grid', linestyle='--', color='black')
plt.grid(True)

plt.show()

我的情节和预期: 附上我的情节和预期

这里有几点

  1. 轴不限于我提供的内容
  2. 网格似乎有所不同。

请有任何解决方法的想法。

更新图片: 更新图片

标签: pythonmatplotlibdata-visualization

解决方案


您的问题与ticker.FixedFormatter. 首先,考虑这个解决方案:

import numpy as np
import matplotlib.ticker as ticker
import matplotlib.pyplot as plt
fig = plt.figure(figsize=(12,3))
ax = fig.add_subplot(111)
t = np.linspace(0.0,2.0,200)
v = np.sin(2.5*np.pi*t)
ax.set(title='Sine Wave', xlabel='time (seconds)', ylabel='Voltage (mV)', xlim = (0,2), ylim=(-1,1))
plt.xticks([0, 0.2, 0.4, 0.6, 0.8, 1.0, 1.2, 1.4, 1.6, 1.8, 2.0])
plt.yticks([-1, 0, 1])
plt.plot(t, v, label='sin(t)',color = 'red')
plt.legend()
ax.grid(color='black', linestyle='--', dashes=[8, 6], alpha=0.5)
plt.grid(True)

plt.show()

结果如下图:

结果

请注意,我更改ax.xaxis.set_major_formatterplt.xticks允许您直接操作 xticks。

您使用FixedFormatter,这意味着刻度位置是固定的,您只需命名它们 - 这就是为什么 yaxis 上的前 3 个刻度为 -1、0、1(您的输入),而不管它们的值是什么。除非您有充分的理由使用matplotlib.ticker(也就是设置刻度的位置或格式化它们),否则我建议使用 simpleplt.xticks来设置它们的值。

第二个变化是通过使用而不是绘制矩形来直接控制网格ax.grid,我认为这更正确。由于您在虚线上的请求非常具体(默认“--”与您要求的不同),我添加了dashed=[float, float]param. 它允许您控制破折号的大小 - 您可以根据需要操作它们。添加了alpha参数以赋予它更多“灰色”风格,但您可以将其删除


推荐阅读