Python,Matplotlib:规范化多个图以适应相同的任意轴限制

时间:2017-04-07 14:37:14

标签: python matplotlib scale axis limits

我正在尝试创建一个包含多个绘图的图形,并将它们全部标准化,以便可以轻松区分它们的特征。我在尝试做什么时遇到了一些问题,但下面的示例代码应该有助于澄清。

以下代码生成的示例图。

代码创建一个包含三行的图形。黑线的数据在-1000和1000之间变化,因此相应地调整比例。这意味着很难看到绿色数据的变化,甚至更多的红色变化。理想情况下,我想放大绿色和红色数据,以便它们的变化更清晰 - 但希望不要只乘以一个恒定值。

我希望的结果示例 - 不同的线都具有不同的数量级,但已经适合任意的y轴刻度,因此可以演示它们的形状。

import numpy as np
import matplotlib.pyplot as plt

time_arr = np.arange(0, 25, 1)

dist_arr = np.zeros(len(time_arr))
speed_arr = np.zeros(len(time_arr))
energy_arr = np.zeros(len(time_arr))

for i in range(len(time_arr)):
    dist_arr[i] = np.random.randint(-10, 10)
    speed_arr[i] = np.random.randint(-50, 50)
    energy_arr[i] = np.random.randint(-1000, 1000)


fig = plt.figure(figsize=(13,13))

plt.plot(time_arr, dist_arr, 'red', linestyle='-', label='dist (m)', linewidth=5)
plt.plot(time_arr, speed_arr, 'lime', linestyle='-', label='speed (m/s)', linewidth=5)
plt.plot(time_arr, energy_arr, 'black', linestyle='--', label='E_tot (J)', linewidth=5)

plt.xlabel('Time (s)', fontsize=25)
plt.ylabel('Various Params', fontsize=25)
plt.tick_params(axis='x', labelsize=20)
plt.tick_params(axis='y', labelsize=20)
plt.title('Various VS Time', fontsize = 32, y=1.008)
plt.legend(loc='best', fontsize=25)

plt.show()

我已经尝试过为每个单独的线条绘制plt.ylim([0,100])之类的东西,但这似乎没有成功。这里的任何帮助都会很棒,干杯。

修改

由于ImportanceOfBeingErnest改进的规范化技术与已接受的答案相结合,评论中的问题已得到解决。谢谢!

3 个答案:

答案 0 :(得分:1)

您可以选择标准化数据,也可以选择多个双y轴。见下文。

import numpy as np
import matplotlib.pyplot as plt

def norm(data):
    return (data)/(max(data)-min(data))

time_arr = np.arange(0, 25, 1)

dist_arr = np.zeros(len(time_arr))
speed_arr = np.zeros(len(time_arr))
energy_arr = np.zeros(len(time_arr))

for i in range(len(time_arr)):
    dist_arr[i] = np.random.randint(-10, 10)
    speed_arr[i] = np.random.randint(-50, 50)
    energy_arr[i] = np.random.randint(-1000, 1000)

# option 1
fig = plt.figure(figsize=(10,10))

plt.plot(time_arr, norm(dist_arr), 'red', linestyle='-', label='dist (m)', linewidth=5)
plt.plot(time_arr, norm(speed_arr), 'lime', linestyle='-', label='speed (m/s)', linewidth=5)
plt.plot(time_arr, norm(energy_arr), 'black', linestyle='--', label='E_tot (J)', linewidth=5)

plt.xlabel('Time (s)', fontsize=25)
plt.ylabel('Various Params', fontsize=25)
plt.tick_params(axis='x', labelsize=20)
plt.tick_params(axis='y', labelsize=20)
plt.title('Various VS Time', fontsize = 32, y=1.008)
plt.legend(loc='best', fontsize=25)

plt.show()

# option 2
fig, ax1 = plt.subplots(1,1,figsize=(12,9))

ax1.plot(time_arr, dist_arr, 'red', linestyle='-', label='dist (m)', linewidth=5)
ax1.set_xlabel('Time (s)', fontsize=25)
# Make the y-axis label, ticks and tick labels match the line color.
ax1.set_ylabel('Distance(m)', color='r',fontsize=25)
ax1.tick_params('y', colors='r', labelsize=20)

ax2 = ax1.twinx()
ax2.plot(time_arr, speed_arr, 'lime', linestyle='-', label='speed (m/s)', linewidth=5)
ax2.set_ylabel('Speed (m/s)', color='lime',fontsize=25)
ax2.tick_params('y', colors='lime', labelsize=20)

ax3 = ax1.twinx()
ax3.spines['right'].set_position(('axes', 1.25)) # move the right axis light bit to the right by 25 % of the axes
ax3.plot(time_arr, norm(energy_arr), 'black', linestyle='--', label='E_tot (J)', linewidth=5)
ax3.set_ylabel('E_tot (J)', color='black',fontsize=25)
ax3.tick_params('y', colors='black', labelsize=20)


fig.tight_layout()
plt.show()

结果

enter image description here enter image description here

答案 1 :(得分:0)

我认为你有两个选择:

  1. 子图 - see this demo。你可以复制“共享两个轴”案例

  2. 双y轴 - see here。我认为这些情节不太清楚,因为很难看出每条曲线使用哪种尺度。

  3. 我建议选项1

答案 2 :(得分:0)

您应该在分子中包含(data -np.amin(x))以正确地重新缩放。