matplotlib 在所有子图上显示x刻度和唯一的y标签

yshpjwxd  于 12个月前  发布在  其他
关注(0)|答案(4)|浏览(81)

我正在绘制两个共享同一个x轴的子图,但当我绘图时,我只能看到第二个子图上的x轴刻度。如何使x刻度在两个子图上都可见?
另外,我想为两个子图设置y标签,但只有第二个可见。你能帮助在两个子图上显示y标签吗?
下面是我的可复制代码。

#!/usr/bin/python3
import pandas as pd
desired_width = 1500
pd.set_option('display.width', desired_width)
import matplotlib.pyplot as plt
import numpy as np

df = pd.DataFrame([{'DATETIME': '2017-09-29 01:00,', 'Population': 1000, 'Temp': 90, 'State': 'California'},
                   {'DATETIME': '2017-09-29 01:00,', 'Population': 2000, 'Temp': 70, 'State': 'Illinois'},
                   {'DATETIME': '2017-09-29 01:00,', 'Population': 3000, 'Temp': 50, 'State': 'Georgia'},
                   {'DATETIME': '2017-09-29 02:00,', 'Population': 2000, 'Temp': 40, 'State': 'California'},
                   {'DATETIME': '2017-09-29 02:00,', 'Population': 6000, 'Temp': 20, 'State': 'Illinois'},
                   {'DATETIME': '2017-09-29 02:00,', 'Population': 4000, 'Temp': 30, 'State': 'Georgia'},
                   {'DATETIME': '2017-09-29 03:00,', 'Population': 3000, 'Temp': 40, 'State': 'California'},
                   {'DATETIME': '2017-09-29 03:00,', 'Population': 4000, 'Temp': 60, 'State': 'Illinois'},
                   {'DATETIME': '2017-09-29 03:00,', 'Population': 2000, 'Temp': 80, 'State': 'Georgia'}])

df.index = df['DATETIME']
df.index = (pd.to_datetime(df.index)).strftime("%m/%d %H:00")

fig, axes = plt.subplots(nrows=2, ncols=1, sharex=True)

df.groupby('State')['Population'].plot(kind='line', linestyle='--', alpha=0.5, marker='o', legend=True, ax=axes[0])
plt.ylabel('Pop')
df.groupby('State')['Temp'].plot(kind='line', linestyle='--', alpha=0.5, marker='o', legend=True, ax=axes[1])
plt.ylabel('Temp')
plt.tick_params(axis='both', which='both', labelsize=7)
plt.tight_layout()
plt.show()

当前图表输出:

xyhw6mcr

xyhw6mcr1#

正如其他答案所提到的,要让ylabel显示在两个子图上,可以使用面向对象的接口axes[0].set_ylabelaxes[1].set_ylabel
您还应该在两个轴上使用.tick_params,以获得两个子图的相同大小的刻度标签等
最后,为了让刻度标签显示在第一个子图上,作为循环所有刻度并将其设置为可见的替代方案,您可以通过多提供一个选项tick_paramslabelbottom=True来实现同样的事情。

fig, axes = plt.subplots(nrows=2, ncols=1, sharex=True)

df.groupby('State')['Population'].plot(kind='line', linestyle='--', alpha=0.5, marker='o', legend=True, ax=axes[0])
axes[0].set_ylabel('Pop')
df.groupby('State')['Temp'].plot(kind='line', linestyle='--', alpha=0.5, marker='o', legend=True, ax=axes[1])
axes[1].set_ylabel('Temp')
axes[0].tick_params(axis='both', which='both', labelsize=7, labelbottom=True)
axes[1].tick_params(axis='both', which='both', labelsize=7)

xcitsw88

xcitsw882#

有几件事你可以做.要么删除sharex = True .或者,如果你想使用,sharex设置x刻度不可见即set_visible(False) .因此,你可以将它们设置为True来停止这一点.
为了使子图的格式相同,您需要为两个子图使用axes[0].tick_params(axis='both', which='both', labelsize=7)来设置每个子图的刻度参数(即为axes[1]重复)
注意,就我个人而言,我更喜欢使用matpotlib面向对象的API,即使用ax.set_ylabel()而不是plt.ylabel(),因为我认为它可以更好地控制您使用的子图和轴。

df = pd.DataFrame([{'DATETIME': '2017-09-29 01:00,', 'Population': 1000, 'Temp': 90, 'State': 'California'},
                   {'DATETIME': '2017-09-29 01:00,', 'Population': 2000, 'Temp': 70, 'State': 'Illinois'},
                   {'DATETIME': '2017-09-29 01:00,', 'Population': 3000, 'Temp': 50, 'State': 'Georgia'},
                   {'DATETIME': '2017-09-29 02:00,', 'Population': 2000, 'Temp': 40, 'State': 'California'},
                   {'DATETIME': '2017-09-29 02:00,', 'Population': 6000, 'Temp': 20, 'State': 'Illinois'},
                   {'DATETIME': '2017-09-29 02:00,', 'Population': 4000, 'Temp': 30, 'State': 'Georgia'},
                   {'DATETIME': '2017-09-29 03:00,', 'Population': 3000, 'Temp': 40, 'State': 'California'},
                   {'DATETIME': '2017-09-29 03:00,', 'Population': 4000, 'Temp': 60, 'State': 'Illinois'},
                   {'DATETIME': '2017-09-29 03:00,', 'Population': 2000, 'Temp': 80, 'State': 'Georgia'}])

df.index = df['DATETIME']
df.index = (pd.to_datetime(df.index)).strftime("%m/%d %H:00")

fig, axes = plt.subplots(nrows=2, ncols=1, sharex=True)

df.groupby('State')['Population'].plot(kind='line', linestyle='--', alpha=0.5, marker='o', legend=True, ax=axes[0])
axes[0].set_ylabel('Pop')
df.groupby('State')['Temp'].plot(kind='line', linestyle='--', alpha=0.5, marker='o', legend=True, ax=axes[1])
axes[1].set_ylabel('Temp')

# Set the formatting the same for both subplots
axes[0].tick_params(axis='both', which='both', labelsize=7)
axes[1].tick_params(axis='both', which='both', labelsize=7)

# set ticks visible, if using sharex = True. Not needed otherwise
for tick in axes[0].get_xticklabels():
    tick.set_visible(True)

plt.tight_layout()
plt.show()

其给出:

iezvtpos

iezvtpos3#

关于第一个问题,我建议不要用额外的墨水来弄乱情节。
现在,在y标签上,你必须使用从plt.subplots得到的轴,
plt.ylabel('Pop') × axes[0].set_ylabel('Pop')plt.ylabel('Pop') × axes[1].set_ylabel('Temp')

2admgd59

2admgd594#

fig, axes = plt.subplots(nrows=2, ncols=1, sharex=True)中删除sharex=True,以获得单独的x轴。
为了ylabels

axes[0].set_ylabel('Pop')
axes[1].set_ylabel('Temp')

相关问题