Я хочу создать сетку подзаголовков с общими осями x. Заговор должен (по некоторым причинам удобства) быть выполнен путем доступа к методу участка Pandas DataFrame. Кроме того, я хочу, чтобы метки x-tick были показаны в первой строке моей сетки. Я попытался добиться этого с помощью следующего кода:
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
x = np.linspace(0,10,100)
nrows = 4
ncols = 3
fig, axes = plt.subplots(nrows, ncols, sharex=True)
for i, ax in enumerate(axes.reshape(-1)):
y = np.cos(x+i*np.pi)
df = pd.DataFrame(y, index=x)
# ax.plot(x, y) # shows top labels
df.plot(ax=ax, legend=None) # doesn't show top labels
if i < ncols:
# first row: plot x-ticks + x-labels
ax.tick_params(which='both', labeltop=True, top=True)
# also none of these approaches works:
# plt.setp(ax.get_xticklabels(), visible=True)
# ax.xaxis.set_tick_params(which='both', labeltop=True, top=True, colors='g')
# for label in ax.get_xticklabels():
# label.set_visible(True)
plt.show()
Использование оригинальной схемы построения шрифтов из Matplotlib работает, но когда я использую метод Pandas, тикалы остаются скрытыми. Любые идеи, почему и как я мог это решить?
Заранее большое спасибо,
Markus
Сначала вы можете создать сюжет, как вы сейчас делаете, а затем установить тики для любого подзаголовка или строки/столбца подзадачи, которую вы хотите, создав двойную ось.
В этом примере дополнительно добавляются x-ticklabels только для первой строки. Вы добавляете эти строки перед plt.show()
. i<3
здесь означает только первую строку, потому что это то, как доступ к подзаголовкам осуществляется по порядку. both
означают как основные, так и незначительные тики. Так как вы еще не показали минорные тики, на данный момент вы получаете только крупные тики. Вы можете настроить операторы if
чтобы добавить x-ticklabels в другую строку, если хотите. Мне пришлось удалить, if я < ncols:
команда из вашего кода, чтобы заставить его работать.
Полный рабочий код
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
import matplotlib
import sys
print (sys.version)
# 3.6.5 |Anaconda, Inc.|
print (matplotlib.__version__)
# 2.2.2
print (pd.__version__)
# 0.23.0
x = np.linspace(0,10,100)
nrows = 4
ncols = 3
fig, axes = plt.subplots(nrows, ncols, sharex=True,figsize=(12,6))
for i, ax in enumerate(axes.reshape(-1)):
y = np.cos(x+i*np.pi)
df = pd.DataFrame(y, index=x)
df.plot(ax=ax, legend=None) # doesn't show top labels
if i < 3:
ax1 = ax.twiny()
ax1.set_xlim(ax.get_xlim())
ax1.tick_params(axis='x', which='both', bottom=False, top=True, labelbottom=False)
plt.tight_layout()
plt.show()
if i < 3: ax.tick_params(axis='x', which='both', bottom=True, top=False, labelbottom=True)
непосредственно в моем цикле for также не работает.