简体   繁体   中英

Adding multiple labels at once for matplotlib subplots from pandas dataframe

I am getting lost here, maybe confusing matplotlib and pandas functionality. I have a dataframe that I want to plot in several subplots to group related data. Everything works as intended, but I cannot get the legend working (which is ridiculously simple if I do not use the subplots). Here is my code:

fig, (acceleration, rotation, rotationspeed) = plt.subplots(3, 1, sharex=True, figsize=(20,15))

acceleration.plot(params[['accX', 'accY', 'accZ']], label=['X', 'Y', 'Z'])
acceleration.set_title('Acceleration')
acceleration.set_ylabel('Acceleration (G)')
acceleration.grid(b = pref_grid_visible)
acceleration.legend()

rotation.plot(params[['roll', 'pitch', 'yaw']])
rotation.set_title('Rotation')
rotation.set_ylabel('Rotation angle (radians)')
rotation.grid(b = pref_grid_visible)

rotationspeed.plot(params[['rotX', 'rotY', 'rotZ']])
rotationspeed.set_title('Rotation speed')
rotationspeed.set_ylabel('Rotation speed (radians / second)')
rotationspeed.grid(b = pref_grid_visible)

# Set shared x label
fig.text(0.5, 0.1, 'Time (ms)')

Labels are not read automatically from the dataframe, and from matplotlib's documentation I understand that label should contain a string, which explains why the attempt to display X, Y and Z axis for acceleration is not working.

标签设置错误的示例

How can I set X, Y and Z labels correctly for each subplot?

Try

acceleration = params[['accX', 'accY', 'accZ']].plot(ax=acceleration)
#rest of code

You can pass an axis to df.plot , which handles legends pretty well, and it returns the same axis which you can further manipulate.

Another way would be

acceleration.plot(params[['accX', 'accY', 'accZ']])
acceleration.legend(['X', 'Y', 'Z'])

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM