我正在绘制两个共享相同x轴的子图,但是当我绘制时,我只看到第二个子图上的x轴刻度。如何在两个子图上显示x-ticks?
另外,我想为两个子图设置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()
当前图表输出:
答案 0 :(得分:2)
你可以做几件事。删除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()
给出了:
答案 1 :(得分:2)
正如其他答案所提到的,为了让ylabel
显示在两个子图上,您可以在axes[0].set_ylabel
和axes[1].set_ylabel
使用面向对象的界面。
您还应该在两个轴上使用.tick_params
来获得两个子图的相同大小的刻度标签等
最后,为了让刻度标签显示在第一个子图上,作为循环所有刻度并且必须将它们设置为可见的替代方法,您可以通过再提供一个选项来实现相同的选择{ {1}}:tick_params
。
labelbottom=True
答案 2 :(得分:1)
从sharex=True
移除fig, axes = plt.subplots(nrows=2, ncols=1, sharex=True)
以使其具有单独的x轴。
对于ylabels
axes[0].set_ylabel('Pop')
axes[1].set_ylabel('Temp')
答案 3 :(得分:1)
关于第一个问题,我建议不要用额外的墨水弄乱情节。
现在,在y标签上。你必须使用从interface Props = {
};
interface State = {
date: Date;
}
class Clock extends Component<Props, State> {
private timerId: any;
constructor(props: Props) {
super(props);
this.state = {
date: new Date()
};
}
...
}
替换
plt.subplots
之前的{p> plt.ylabel('Pop')
和
axes[0].set_ylabel('Pop')
的{{1}}