Python - диаграмма с двумя осями у, выровнять ноль - PullRequest
0 голосов
/ 26 июня 2018

Я пытаюсь создать горизонтальную гистограмму с двумя осями X.2 оси сильно различаются по масштабу, 1 набор идет от -5 до 15 (положительное и отрицательное значение), другой набор больше похож на 100 до 500 (все положительные значения).

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

Я нашел пример align_yaxis, но я изо всех сил пытаюсь выровнять xоси. Гистограммы Matplotlib: выравнивание двух разных осей y по нулю

Вот пример того, над чем я работаю с простыми тестовыми данными.Есть идеи / предложения?спасибо

import pandas as pd
import matplotlib.pyplot as plt

d = {'col1':['Test 1','Test 2','Test 3','Test 4'],'col 2':[1.4,-3,1.3,5],'Col3':[900,750,878,920]}
df = pd.DataFrame(data=d)

fig = plt.figure()  # Create matplotlib figure

ax = fig.add_subplot(111)  # Create matplotlib axes
ax2 = ax.twiny()  # Create another axes that shares the same y-axis as ax.

width = 0.4

df['col 2'].plot(kind='barh', color='darkblue', ax=ax, width=width, position=1,fontsize =4, figsize=(3.0, 5.0))
df['Col3'].plot(kind='barh', color='orange', ax=ax2, width=width, position=0, fontsize =4, figsize=(3.0, 5.0))

ax.set_yticklabels(df.col1)
ax.set_xlabel('Positive and Neg',color='darkblue')
ax2.set_xlabel('Positive Only',color='orange')

ax.invert_yaxis()
plt.show()

1 Ответ

0 голосов
/ 26 июня 2018

Я перешел по ссылке из вопроса и в конечном итоге получил этот ответ: https://stackoverflow.com/a/10482477/5907969

Ответ имеет функцию для выравнивания осей Y, и я изменил то же самое для выравнивания осей X, как иследует:

def align_xaxis(ax1, v1, ax2, v2):
    """adjust ax2 xlimit so that v2 in ax2 is aligned to v1 in ax1"""
    x1, _ = ax1.transData.transform((v1, 0))
    x2, _ = ax2.transData.transform((v2, 0))
    inv = ax2.transData.inverted()
    dx, _ = inv.transform((0, 0)) - inv.transform((x1-x2, 0))
    minx, maxx = ax2.get_xlim()
    ax2.set_xlim(minx+dx, maxx+dx)

А затем используйте его в коде следующим образом:

import pandas as pd
import matplotlib.pyplot as plt

d = {'col1':['Test 1','Test 2','Test 3','Test 4'],'col 2' [1.4,-3,1.3,5],'Col3':[900,750,878,920]}
df = pd.DataFrame(data=d)

fig = plt.figure()  # Create matplotlib figure

ax = fig.add_subplot(111)  # Create matplotlib axes
ax2 = ax.twiny()  # Create another axes that shares the same y-axis as ax.

width = 0.4

df['col 2'].plot(kind='barh', color='darkblue', ax=ax, width=width, position=1,fontsize =4, figsize=(3.0, 5.0))
df['Col3'].plot(kind='barh', color='orange', ax=ax2, width=width, position=0, fontsize =4, figsize=(3.0, 5.0))

ax.set_yticklabels(df.col1)
ax.set_xlabel('Positive and Neg',color='darkblue')
ax2.set_xlabel('Positive Only',color='orange')

align_xaxis(ax,0,ax2,0)
ax.invert_yaxis()
plt.show()

Это даст вам то, что вы ищете enter image description here

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