Как я могу сделать подсюжеты в matplotlib с разными xlimit и размером оси-x? - PullRequest
0 голосов
/ 24 января 2020

Как я могу решить это? Я хочу сделать 4 субплота с помощью matplotlib, я использовал опцию subplot, но в результате получился просто большой сюжет. Я понятия не имею, в чем проблема. Я хочу увидеть четыре сюжета, каждый с заголовком и подзаголовком для них.

Понятия не имею, как я могу это решить?

Можете ли вы помочь мне, пожалуйста, чтобы исправить это? Большое спасибо

#!/usr/bin/env python
# -*- coding: utf-8 -*-

from __future__ import unicode_literals
from matplotlib.collections import LineCollection
import matplotlib.patches as mpatches
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
import matplotlib as mpl
import matplotlib.ticker as tkr
from pylab import text


with open("file1.txt") as f:
         m1 = map(float,f)

with open ("file2.txt") as f:
         m2 = map(float, f)

fig, ax = plt.subplots(sharey='row')
fig.set_figwidth(18)  #Width figure
fig.set_figheight(12) #Height figure

plt.rcParams['figure.dpi'] = 300
plt.subplots_adjust(wspace=0.18, hspace=0.2)

fig.suptitle('PLOTS', y=0.93, fontsize=15)

# Plot
plt.subplot(421)
y = np.array(m1)
x = np.arange(len(y))
threshold = 0.5
segments_x = np.r_[x[0], x[1:-1].repeat(2), x[-1]].reshape(-1, 2)
segments_y = np.r_[y[0], y[1:-1].repeat(2), y[-1]].reshape(-1, 2)
linecolors = ['red' if y_[0] > threshold and y_[1] > threshold else 'blue'
              for y_ in segments_y]
segments = [zip(x_, y_) for x_, y_ in zip(segments_x, segments_y)]
ax = plt.axes()
ax.add_collection(LineCollection(segments, colors=linecolors))
ax.set_ylim(-0.06, 1.07)
ax.set_xlim(0,268)
blue_patch = mpatches.Patch(color='blue', label='ordenada')
red_patch = mpatches.Patch(color='red', label='desordenada')
plt.legend(handles=[blue_patch, red_patch], loc='lower left', fontsize=12)
plt.axhline(y=0.5, color='black', linestyle='--')
plt.title(r'Protein', fontsize=18)
plt.xlabel(r'# Residue', fontsize=16)
plt.ylabel(r'(%)', fontsize=16)
plt.xticks(size=12)
plt.yticks(size=12)
plt.xticks(np.arange(min(x), max(x)+1, 10))
plt.grid()
plt.tight_layout()

# Plot
plt.subplot(423)
p = np.array(m2)
o = np.arange(len(p))
threshold = 0.5
segments_o = np.r_[o[0], o[1:-1].repeat(2), o[-1]].reshape(-1, 2)
segments_p = np.r_[p[0], p[1:-1].repeat(2), p[-1]].reshape(-1, 2)
linecolors = ['red' if p_[0] > threshold and p_[1] > threshold else 'blue'
              for p_ in segments_p]
segments = [zip(o_, p_) for o_, p_ in zip(segments_o, segments_p)]
ax = plt.axes()
ax.add_collection(LineCollection(segments, colors=linecolors))
ax.set_ylim(-0.06, 1.07)
ax.set_xlim(0,383)
blue_patch = mpatches.Patch(color='blue', label='ordenada')
red_patch = mpatches.Patch(color='red', label='desordenada')
plt.legend(handles=[blue_patch, red_patch], loc='lower left', fontsize=12)
plt.axhline(y=0.5, color='black', linestyle='--')
plt.title(r'Protein', fontsize=18)
plt.xlabel(r'# Residue', fontsize=16)
plt.ylabel(r'(%)', fontsize=16)
plt.xticks(size=12)
plt.yticks(size=12)
plt.xticks(np.arange(min(o), max(o)+1, 10))
plt.grid()
plt.tight_layout()
plt.show()

#plt.savefig('figure.png', format='png', bbox_inches="tight", dpi=300)

Как я могу решить эту проблему? в чем проблема?

1 Ответ

1 голос
/ 24 января 2020

Вам необходимо указать количество участков, которые вы хотите создать, с помощью matplotlib.pyplot.subplots,

nrows = 2
ncols = 2
fig, ax = plt.subplots(nrows, ncols, sharey='row')

, что создаст массив axes экземпляров с формой (nrows, ncols). Затем вы можете нанести на отдельный axes через

ax[0,0].plot(...)

Хотя для установки свойств тиков, меток и т. Д. c для axes необходимо использовать версии функций axes вместо версий pyplot. Т.е.

ax[0, 0].set_xticks(...)
# instead of 
plt.xticks(...)

ax[0, 0].set_title(...)
# instead of 
plt.title(...)

ax[0, 0].set_xlabel(...)
# instead of
plt.set_xlabel(...)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...