matplotlib: две оси оси y, как выровнять линии сетки?

Я рисую два набора данных с разными единицами по оси y. Есть ли способ сделать метки и линии сетки выровнены по обоим по оси Y? Первое изображение показывает, что я получаю, а второе изображение показывает, что я хотел бы получить.

Это код, который я использую для построения:

import seaborn as sns import numpy as np import pandas as pd np.random.seed(0) fig = plt.figure() ax1 = fig.add_subplot(111) ax1.plot(pd.Series(np.random.uniform(0,1,size=10))) ax2 = ax1.twinx() ax2.plot(pd.Series(np.random.uniform(10,20,size=10)),color='r') 

пример нежелательного поведения

пример разыскиваемого поведения

  • Конфигурация Seaborn скрывает по умолчанию matplotlib
  • Проблема с морским садом в возвышенном
  • Как добавить проценты в верхней части баров в море?
  • Переместить легенду легендарного сюжета на другую позицию?
  • Как создать групповые подсети в Пандах?
  • Вычисление ошибок в базах данных с использованием Seaborn FacetGrid
  • Шрифты по умолчанию в визуализации статистических данных Seaborn в iPython
  • Как изменить размер шрифта с помощью Seaborn FacetGrid?
  • 5 Solutions collect form web for “matplotlib: две оси оси y, как выровнять линии сетки?”

    Не уверен, что это самый красивый способ сделать это, но он исправляет его одной строкой.

     import matplotlib.pyplot as plt import seaborn as sns import numpy as np import pandas as pd np.random.seed(0) fig = plt.figure() ax1 = fig.add_subplot(111) ax1.plot(pd.Series(np.random.uniform(0,1,size=10))) ax2 = ax1.twinx() ax2.plot(pd.Series(np.random.uniform(10,20,size=10)),color='r') # ADD THIS LINE ax2.set_yticks(np.linspace(ax2.get_yticks()[0],ax2.get_yticks()[-1],len(ax1.get_yticks()))) plt.show() 

    Поздно к партии, но я написал эту функцию, которая принимает объекты осей matplotlib ax1, ax2 и floats minresax1 minresax2

     def align_y_axis(ax1, ax2, minresax1, minresax2): """ Sets tick marks of twinx axes to line up with 7 total tick marks ax1 and ax2 are matplotlib axes Spacing between tick marks will be a factor of minresax1 and minresax2""" ax1ylims = ax1.get_ybound() ax2ylims = ax2.get_ybound() ax1factor = minresax1 * 6 ax2factor = minresax2 * 6 ax1.set_yticks(np.linspace(ax1ylims[0], ax1ylims[1]+(ax1factor - (ax1ylims[1]-ax1ylims[0]) % ax1factor) % ax1factor, 7)) ax2.set_yticks(np.linspace(ax2ylims[0], ax2ylims[1]+(ax2factor - (ax2ylims[1]-ax2ylims[0]) % ax2factor) % ax2factor, 7)) 

    Он вычисляет и устанавливает тики, так что есть 7 тиков, самый низкий тик соответствует текущему самому низкому тику и увеличивает максимальный тик, так что разделение между каждым тиком целых кратных minrexax1 или minrexax2.

    Чтобы сделать его общим, вы можете установить общее количество тиков, которое вы хотите, изменив все 7 вы увидите общее количество тиков, и измените 6 на общее количество тиков минус 1.

    EDIT: я поставил запрос на растяжение, чтобы включить его в matplotlib.ticker.LinearLocator: https://github.com/matplotlib/matplotlib/issues/6142

    В будущем (возможно, matplotlib 2.0?), Попробуйте:

     import matplotlib.ticker nticks = 11 ax1.yaxis.set_major_locator(matplotlib.ticker.LinearLocator(nticks)) ax2.yaxis.set_major_locator(matplotlib.ticker.LinearLocator(nticks)) 

    который должен просто работать и выбирать удобные тики для оси y "

    Я мог бы решить это, дезактивируя ax.grid(None) в одной из осей сетки.

     import matplotlib.pyplot as plt import seaborn as sns import numpy as np import pandas as pd fig = plt.figure() ax1 = fig.add_subplot(111) ax1.plot(pd.Series(np.random.uniform(0,1,size=10))) ax2 = ax1.twinx() ax2.plot(pd.Series(np.random.uniform(10,20,size=10)),color='r') ax2.grid(None) plt.show() 

    Результат отображения

    Если вы используете метки осей, решение Leo может оттолкнуть их сбоку из-за точности чисел в тиках.

    Так что в дополнение к чему-то вроде решения Лео (повторяется здесь)

     ax2.set_yticks(np.linspace(ax2.get_yticks()[0],ax2.get_yticks()[-1],len(ax1.get_yticks()))) 

    вы можете использовать настройку autolayout , как указано в этом ответе ; например, ранее в вашем скрипте вы можете обновить rcParams :

     from matplotlib import rcParams rcParams.update({'figure.autolayout': True}) 

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

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

     import matplotlib.pyplot as plt import seaborn as sns import numpy as np import pandas as pd fig = plt.figure() ax1 = fig.add_subplot(111) ax1.plot(pd.Series(np.random.uniform(0,1,size=10))) ax2 = ax1.twinx() ax2.plot(pd.Series(np.random.uniform(10,20,size=10)),color='r') ax2.grid(None) # Determine which plot has finer grid. Set pointers accordingly l1 = len(ax1.get_yticks()) l2 = len(ax2.get_yticks()) if l1 > l2: a = ax1 b = ax2 l = l1 else: a = ax2 b = ax1 l = l2 # Respace grid of 'b' axis to match 'a' axis b_ticks = np.linspace(b.get_yticks()[0],b.get_yticks()[-1],l) b.set_yticks(b_ticks) plt.show() 
    Interesting Posts

    Изменение виртуального файла, чтобы пакеты, установленные в глобальных пакетах сайтов, были доступны

    Как аутентифицировать себя как API для Google Диска?

    Python MySQL OperationalError: 1045, «Доступ запрещен для пользователя root @» localhost '

    Python обратное / обратное отображение (но с несколькими значениями для каждого ключа)

    import csv с различным количеством столбцов в строке с использованием Pandas

    zeromq: как предотвратить бесконечное ожидание?

    Независимый от платформы инструмент для копирования текста в буфер обмена

    Windows не передает аргументы командной строки программам Python, выполняемым из оболочки

    Эквивалент Matlab 'ismember' в numpy (Python)?

    чтение внешнего скрипта sql в python

    группа по годам, месяцам, дням в sqlalchemy

    Как предотвратить добавление двух массивов путем трансляции в numpy?

    openpyxl найти ячейку или строку по значению

    Pandas Grouping – значения в процентах от сгруппированных итогов не работают

    Python, Определите, должна ли строка быть преобразована в Int или Float

    Python - лучший язык программирования в мире.