Изменение порядка элементов в комбинированном графе sns python - PullRequest
0 голосов
/ 01 октября 2019

Мне нужен график с тремя разными осями. Пока что я адаптировал один скрипт, который нашел в сети. К сожалению, я заметил, что мои данные не упорядочены должным образом. Сначала я сортирую свой фрейм данных по столбцу с именем «a», но на последнем рисунке сортируется только этот столбец. Я хотел бы заказать их все. Когда я печатаю фрейм данных после сортировки, все выглядит нормально. Я буду очень признателен за любую помощь. Вот мой фрейм данных после того, как я отсортировал его по столбцу 'a' , а вот окончательный график, где отсортирована только площадь водосбора, но указаны названия водосборов, средняя высота и средний уклон водосборовнеправильно отсортированы .

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns; sns.set()
from matplotlib.ticker import PercentFormatter

data1 = 'path to my .xlsx file'
df = pd.read_excel(data1, 'catchments_basic')# loading data 
df_sorted = df.sort_values(by=['a'], ascending=False)

def make_patch_spines_invisible(ax):
    ax.set_frame_on(True)
    ax.patch.set_visible(False)
    for sp in ax.spines.values():
        sp.set_visible(False)

sns.set(style="white", rc={"lines.linewidth": 3})
fig, ax = plt.subplots(figsize=(15,10))
fig.subplots_adjust(right=0.75)

ax1 = ax.twinx()
ax2 = ax.twinx()

# Offset the right spine of par2.  The ticks and label have already been
# placed on the right by twinx above.
ax2.spines["right"].set_position(("axes", 1.1))
# Having been created by twinx, par2 has its frame off, so the line of its
# detached spine is invisible.  First, activate the frame but make the patch
# and spines invisible.
make_patch_spines_invisible(ax2)
# Second, show the right spine.
ax2.spines["right"].set_visible(True)


host = sns.barplot(x=df_sorted['Catchment'],
            y=df_sorted["a"],
            color='#004488',
            label="area",
            ax=ax)
par1 = sns.lineplot(x=df_sorted['Catchment'], 
             y=df_sorted["b"],
             color='r',
             marker="o",
             label="mean elevation",
             ax=ax1)
par2 = sns.lineplot(x=df_sorted['Catchment'], 
             y=df_sorted["c"],
             color='g',
             marker="o",
             label="mean slope",
             ax=ax2)


host.set_xlim(-1, 20)
host.set_ylim(0, 1000)
par1.set_ylim(0, 1000)
par2.set_ylim(0, 100)

host.set_xlabel("river catchment")
host.set_ylabel("area [$km^2$]")
par1.set_ylabel("mean elevation [m n. m.]")
par2.set_ylabel("mean slope [%]")

host.yaxis.label.set_color(color='#004488')
par1.yaxis.label.set_color(color='r')
par2.yaxis.label.set_color(color='g')


tkw = dict(size=4, width=1.5)
host.tick_params(axis='y', colors='#004488', **tkw)
host.tick_params(axis='x', colors='black', **tkw)
par1.tick_params(axis='y', colors='r', **tkw)
par2.tick_params(axis='y', colors='g', **tkw)
host.tick_params(axis='povodie', **tkw)

ax2.yaxis.set_major_formatter(PercentFormatter(decimals=0))
for tick in host.get_xticklabels():   
    tick.set_rotation(45)

host.set_title('Area, mean altitude and mean slope in selected river catchments', family='Arial', size=12, weight='bold')

host.grid(linestyle="dotted", color='black')
host.legend(loc='upper left')
par1.legend(loc='upper center')
par2.legend(loc='upper right')


save_results_to = 'path where I want to save figure 
plt.tight_layout(pad=2) 
plt.savefig(save_results_to + 'basic_characteristics_bar_line_combination.png', dpi = 300)
plt.show()

print ('done')
...