matplotlib matshow xtick метки сверху и снизу - PullRequest
2 голосов
/ 22 марта 2019

Я пытаюсь визуализировать матрицу совпадений имен.Эта версия работает нормально:

import pandas as pd
import numpy as np
import string
import matplotlib.pyplot as plt

n = 10
names = ['Long Name ' + suffix for suffix in string.ascii_uppercase[:n]]
df = pd.DataFrame(np.random.randint(0, 100, size=(n,n)),
                  columns=names, index=names)

fig = plt.figure()
ax = plt.gca()

im = ax.matshow(df, interpolation='none')
fig.colorbar(im)

ax.set_xticks(np.arange(n))
ax.set_xticklabels(names)
ax.set_yticks(np.arange(n))
ax.set_yticklabels(names)
ax.xaxis.set_ticks_position("bottom")
plt.setp(ax.get_xticklabels(), rotation=45,
         ha="right", rotation_mode="anchor")

for (i,j), z in np.ndenumerate(df):
  if z != 0:
    ax.text(j, i, str(z), ha="center", va="center")

ax.set_title("Name Co-Occurrences")
fig.tight_layout()
plt.show()

Проблема в том, что у меня достаточно большая матрица, поэтому я хотел бы отображать имена как сверху, так и снизу.Я пытался сделать это, используя twiny:

import pandas as pd
import numpy as np
import string
import matplotlib.pyplot as plt

n = 10
names = ['Long Name ' + suffix for suffix in string.ascii_uppercase[:n]]
df = pd.DataFrame(np.random.randint(0, 100, size=(n,n)),
                  columns=names, index=names)

fig = plt.figure()
botax = plt.gca()

im = botax.matshow(df, interpolation='none')
fig.colorbar(im)

topax = botax.twiny()
for ax, ha, pos in zip([topax, botax], ["left", "right"], ["top", "bottom"]):
  ax.set_xticks(np.arange(n))
  ax.set_xticklabels(names)
  ax.set_yticks(np.arange(n))
  ax.set_yticklabels(names)
  ax.xaxis.set_ticks_position(pos)
  plt.setp(ax.get_xticklabels(), rotation=45,
           ha=ha, va="center", rotation_mode="anchor")

for (i,j), z in np.ndenumerate(df):
  if z != 0:
    botax.text(j, i, str(z), ha="center", va="center")

botax.set_title("Name Co-Occurrences")
fig.tight_layout()
plt.show()

К сожалению, верхние метки не выровнены правильно, и я не знаю почему: Misaligned X tick labels

Ответы [ 2 ]

3 голосов
/ 22 марта 2019

Для обозначения нижней и верхней осей нет необходимости в двойных осях.Это может сделать все это немного проще.Вместо этого вы можете просто включить нижнюю и верхнюю отметки и метки, а затем повернуть их и выровнять по отдельности.

import pandas as pd
import numpy as np
import string
import matplotlib.pyplot as plt

n = 10
names = ['Long Name ' + suffix for suffix in string.ascii_uppercase[:n]]
df = pd.DataFrame(np.random.randint(0, 100, size=(n,n)),
                  columns=names, index=names)

fig = plt.figure()
ax = plt.gca()

im = ax.matshow(df, interpolation='none')
fig.colorbar(im)

ax.set_xticks(np.arange(n))
ax.set_xticklabels(names)
ax.set_yticks(np.arange(n))
ax.set_yticklabels(names)

# Set ticks on both sides of axes on
ax.tick_params(axis="x", bottom=True, top=True, labelbottom=True, labeltop=True)
# Rotate and align bottom ticklabels
plt.setp([tick.label1 for tick in ax.xaxis.get_major_ticks()], rotation=45,
         ha="right", va="center", rotation_mode="anchor")
# Rotate and align top ticklabels
plt.setp([tick.label2 for tick in ax.xaxis.get_major_ticks()], rotation=45,
         ha="left", va="center",rotation_mode="anchor")

ax.set_title("Name Co-Occurrences", pad=55)
fig.tight_layout()
plt.show()

enter image description here

1 голос
/ 22 марта 2019

Вы должны будете сначала установить соотношение сторон верхней оси X таким же, как и у нижней оси X. Как это сделать, ответили здесь . Затем вы можете использовать y=1.3, чтобы немного поднять заголовок вверх, чтобы он не перекрывался с метками верхней оси x.

topax = botax.twiny()

aspect0 = botax.get_aspect()
if aspect0 == 'equal':
    aspect0 = 1.0
dy = np.abs(np.diff(botax.get_ylim()))
dx = np.abs(np.diff(botax.get_xlim()))

aspect = aspect0 / (float(dy) / dx)
topax.set_aspect(aspect)

for ax, ha, pos in zip([topax, botax], ["left", "right"], ["top", "bottom"]):
  ax.set_xticks(np.arange(n))
  .....
  .....

botax.set_title("Name Co-Occurrences", y=1.3)

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...