Первый график с использованием твин х не отображается? - PullRequest
0 голосов
/ 12 февраля 2020

Я пытаюсь построить некоторые данные, разделяющие ось x (обе даты имеют индекс с pandas) и с отдельными осями y. Я застрял, первый сюжет не хочет появляться после того, как второй сюжет нарисован. Обе оси Y выглядят так, как будто они справа, а графики работают раздельно, но когда я их соединяю, что-то идет ужасно неправильно. Помогите? Мой пример с фиктивными данными работал нормально, но с моими реальными данными из Excel он ломается. Я новичок в python, и я много гуглил, но просто не могу понять это.

import matplotlib.pyplot as plt
import pandas as pd
import numpy as np
import matplotlib.style as style
import matplotlib.dates as mdates
from datetime import datetime

style.available
style.use('seaborn-whitegrid')

# 'dd-mm-yyyy' - inclusive
Filter_Date_Start = '1990-01-01'
Filter_Date_End = '2020-01-01'

Title_Chart_Text = 'Chart'
Title_Yaxis1_Text = 'Y1'
Title_Yaxis2_Text = 'Y2'
Title_Xaxis_Text = 'X'

Text_Size_Yaxis1_Labels = 14
Text_Size_Yaxis2_Labels = 14
Text_Size_Xaxis_Labels = 14
Text_Size_Yaxis1_Title = 20
Text_Size_Yaxis2_Title = 20
Text_Size_Xaxis_Title = 20

#Axis Limits
Y1_Min = 200
Y1_Max =400

Y2_Min = -100
Y2_Max = 200

Filter = ['MB43','MB44']
#Filter = ['X','Y']

#A = {'Adate': ['01/01/2020', '02/01/2020', '03/01/2020','01/01/2020','02/01/2020', '03/01/2020','01/01/2020', '02/01/2020', '03/01/2020'], 'A1': ['X', 'X', 'X','Y','Y','Y','Z','Z','Z'], 'A2': [20,30,40,40,30,20,50,50,50]}
#B = {'Bdate': ['01/01/2020', '02/01/2020', '03/01/2020'], 'B1': [3, 3, 3]}

dfA = pd.read_excel (r'W:\297 Perilya Broken Hill South Mine HA\Stage 2\3. Processing\Excel\GWL.xlsm', sheet_name='GWL', parse_dates=['Date'])
dfB = pd.read_excel (r'W:\297 Perilya Broken Hill South Mine HA\Stage 2\3. Processing\Excel\GWL.xlsm', sheet_name='RainMonthly', parse_dates=['Date'])

#dfA = pd.DataFrame(data=A)
#dfB = pd.DataFrame(data=B)

dfA['Date'] = pd.to_datetime(dfA['Date'],format='%d/%m/%Y')
dfB['Date'] = pd.to_datetime(dfB['Date'],format='%d/%m/%Y')

dfA.set_index('Date', inplace=True)
dfB.set_index('Date', inplace=True)

dfA = dfA[(dfA['Bore'].isin(Filter))]
dfA = dfA[(dfA.index >= Filter_Date_Start) & (dfA.index <= Filter_Date_End)]
#dfB = dfB[(dfB.index >= Filter_Date_Start) & (dfB.index <= Filter_Date_End)]

#print(dfA)
#print(dfB)

fig, ax1 = plt.subplots(figsize=(20, 8))

ax2 = ax1.twinx()  # instantiate a second axes that shares the same x-axis

ax1.set_xlabel(Title_Xaxis_Text, size=Text_Size_Xaxis_Title, labelpad=20)
ax1.set_ylabel(Title_Yaxis1_Text, size=Text_Size_Yaxis1_Title, color='red')
ax1.tick_params(axis='y', labelsize=Text_Size_Yaxis1_Labels, labelcolor='red')

ax2.set_ylabel(Title_Yaxis2_Text, size=Text_Size_Yaxis2_Title,color='blue')  # we already handled the x-label with ax1
ax2.tick_params(axis='y', labelsize=Text_Size_Yaxis2_Labels, labelcolor='blue')

for name, grouped in dfA.groupby(['Bore'], as_index=False):
    grouped.plot(y='mAHD', ax=ax1, label=name)

#dfA.set_index('Date', inplace=True)    

dfB.plot(y='Rolling_Reg', ax=ax2, color='blue')

#ax1.set_ylim([Y1_Min, Y1_Max])
#ax2.set_ylim([Y2_Min, Y2_Max])

#Matching y-axis grids
ylim1 = ax1.get_ylim()
len1 = ylim1[1]-ylim1[0]
yticks1 = ax1.get_yticks()
rel_dist = [(y-ylim1[0])/len1 for y in yticks1]
ylim2 = ax2.get_ylim()
len2 = ylim2[1]-ylim2[0]
yticks2 = [ry*len2+ylim2[0] for ry in rel_dist]
ax2.set_yticks(yticks2)
ax2.set_ylim(ylim2)
ax1.yaxis.grid(which="major")
ax2.yaxis.grid(which="major", linestyle='-')
ax1.legend(loc='upper center', bbox_to_anchor=(0.5, -0.3), ncol=11)
ax2.legend(loc='center left', bbox_to_anchor=(0.5, -0.3), ncol=1)

ax1.xaxis.set_major_locator(mdates.YearLocator())
ax1.xaxis.set_major_formatter(mdates.DateFormatter('%b-%Y'))

ax1.tick_params(axis='x', labelsize=Text_Size_Xaxis_Labels, rotation=90)

fig.tight_layout()  # otherwise the right y-label is slightly clipped
plt.show()

Это общий график, который я строил, который, казалось, работал, но как только я использую реальные данные, это ломается? Насколько я могу сказать даты

import matplotlib.pyplot as plt
import pandas as pd
import numpy as np
import matplotlib.style as style
import matplotlib.dates as mdates
from datetime import datetime

style.available
style.use('seaborn-whitegrid')

# 'dd-mm-yyyy' - inclusive
Filter_Date_Start = '2020-01-01'
Filter_Date_End = '2020-01-02'

Title_Chart_Text = 'Chart'
Title_Yaxis1_Text = 'Y1'
Title_Yaxis2_Text = 'Y2'
Title_Xaxis_Text = 'X'

Text_Size_Yaxis1_Labels = 14
Text_Size_Yaxis2_Labels = 14
Text_Size_Xaxis_Labels = 14
Text_Size_Yaxis1_Title = 20
Text_Size_Yaxis2_Title = 20
Text_Size_Xaxis_Title = 20

Filter = ['X','Y']

A = {'Adate': ['01/01/2020', '02/01/2020', '03/01/2020','01/01/2020','02/01/2020', '03/01/2020','01/01/2020', '02/01/2020', '03/01/2020'], 'A1': ['X', 'X', 'X','Y','Y','Y','Z','Z','Z'], 'A2': [20,30,40,40,30,20,50,50,50]}
B = {'Bdate': ['01/01/2020', '02/01/2020', '03/01/2020'], 'B1': [3, 3, 3]}

dfA = pd.DataFrame(data=A)
dfB = pd.DataFrame(data=B)

dfA['Adate'] = pd.to_datetime(dfA['Adate'],format='%d/%m/%Y')
dfB['Bdate'] = pd.to_datetime(dfB['Bdate'],format='%d/%m/%Y')

dfA.set_index('Adate', inplace=True)
dfB.set_index('Bdate', inplace=True)

dfA = dfA[(dfA['A1'].isin(Filter))]
dfA = dfA[(dfA.index >= Filter_Date_Start) & (dfA.index <= Filter_Date_End)]
dfB = dfB[(dfB.index >= Filter_Date_Start) & (dfB.index <= Filter_Date_End)]

fig, ax1 = plt.subplots(figsize=(20, 8))

color = 'tab:red'
ax1.set_xlabel(Title_Xaxis_Text, size=Text_Size_Xaxis_Title, labelpad=20)
ax1.set_ylabel(Title_Yaxis1_Text, size=Text_Size_Yaxis1_Title, color=color)
ax1.tick_params(axis='y', labelsize=Text_Size_Yaxis1_Labels, labelcolor=color)

for name, grouped in dfA.groupby('A1'):
    grouped.plot(y='A2', ax=ax1, label=name)

ax2 = ax1.twinx()  # instantiate a second axes that shares the same x-axis

color = 'tab:blue'
ax2.set_ylabel(Title_Yaxis2_Text, size=Text_Size_Yaxis2_Title,color=color)  # we already handled the x-label with ax1
dfB.plot(ax=ax2, color='red')
ax2.tick_params(axis='y', labelsize=Text_Size_Yaxis2_Labels, labelcolor=color)

ax1.set_ylim([20, 40])
ax2.set_ylim([2, 4])

#Matching y-axis grids
ylim1 = ax1.get_ylim()
len1 = ylim1[1]-ylim1[0]
yticks1 = ax1.get_yticks()
rel_dist = [(y-ylim1[0])/len1 for y in yticks1]
ylim2 = ax2.get_ylim()
len2 = ylim2[1]-ylim2[0]
yticks2 = [ry*len2+ylim2[0] for ry in rel_dist]
ax2.set_yticks(yticks2)
ax2.set_ylim(ylim2)
ax1.yaxis.grid(which="major")
ax2.yaxis.grid(which="major", linestyle='-')
ax1.legend(loc='upper left', bbox_to_anchor=(0.5, -0.3), ncol=11)
ax2.legend(loc='upper right', bbox_to_anchor=(0.5, -0.3), ncol=11)


ax1.xaxis.set_major_formatter(mdates.DateFormatter('%b-%Y'))

ax1.tick_params(axis='x', labelsize=Text_Size_Xaxis_Labels, rotation=90)

fig.tight_layout()  # otherwise the right y-label is slightly clipped
plt.show()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...