2013-12-12 4 views
10

Я пытаюсь сделать сюжет, похожий на этом отличиться например:Несколько строк х клещевых меток в Matplotlib

example

Я хотел бы знать, если есть в любом случае, чтобы иметь второй слой на x tick labels (например, «5-летнее статистическое резюме»). Я знаю, что могу делать метки многострочного тика, используя \n, но я хочу, чтобы иметь возможность менять два уровня независимо друг от друга.

+1

Хороший пример нескольких осей находится здесь: http://stackoverflow.com/questions/7761778/matplotlib-adding-second-axes-with-transparent-background Это достаточно близко? – tom10

+0

Это похоже на то, что я хочу, но я не хочу, чтобы была вторая физическая ось x. Я в основном хочу добавить вторую строку текста к первой оси, которая может перемещаться независимо от первой. то есть «Фон» всегда находится в том же положении, но «5-летнее резюме» можно перемещать влево или вправо в зависимости от того, сколько графиков добавлено в график. – HHains

+1

Легко скрывать вторую ось. В целом, не совсем понятно, как вы хотите, чтобы все изменилось. Что заперто на что? Вы можете использовать 'text',' annotate' или 'axis' и' spines' (даже если вы не показываете фактическую ось, связанную с этими двумя). Что будет проще для вас, зависит не от изображения, которое вы показываете, а от того, что вы хотите, чтобы разные элементы регистрировались (как при масштабировании графика, так и при изменении входов). В настоящее время это все неясно (т. Е. Когда вы двигаете «5-летняя сводка», что-то изменилось?). – tom10

ответ

0

Лучшее решение, которое я нашел, это использовать функцию plt.annotate. Это хорошо описано здесь: in the last comment

11

это приближается:

xtick

fig = plt.figure(figsize=(8, 4)) 
ax = fig.add_axes([.05, .1, .9, .85 ]) 
ax.set_yticks(np.linspace(0, 200, 11)) 

xticks = [ 2, 3, 4, 6, 8, 10 ] 
xticks_minor = [ 1, 5, 7, 9, 11 ] 
xlbls = [ 'background', '5 year statistical summary', 'future build', 
      'maximum day', '90th percentile day', 'average day' ] 

ax.set_xticks(xticks) 
ax.set_xticks(xticks_minor, minor=True) 
ax.set_xticklabels(xlbls) 
ax.set_xlim(1, 11) 

ax.grid('off', axis='x') 
ax.grid('off', axis='x', which='minor') 

# vertical alignment of xtick labels 
va = [ 0, -.05, 0, -.05, -.05, -.05 ] 
for t, y in zip(ax.get_xticklabels(), va): 
    t.set_y(y) 

ax.tick_params(axis='x', which='minor', direction='out', length=30) 
ax.tick_params(axis='x', which='major', bottom='off', top='off') 
1

Я не могу прокомментировать ответ Behzad в связи с отсутствием репутации. Я нашел, что его решение очень полезно, но я думал, что хочу поделиться этим, вместо того, чтобы контролировать вертикальное выравнивание с помощью set_y(), я просто добавил символ новой строки, чтобы вертикально смещать метки. Таким образом, для приведенного выше примера:

xlbls = [ 'background', '\n5 year statistical summary', 'future build', 
     '\nmaximum day', '\n90th percentile day', '\naverage day' ] 

Для меня это было лучшим решением для хранения многострочной этикетки и многослойные этикеток вертикально.

Смежные вопросы