Ich bin neu zu Matplotlib und versuchen, Plots von Pandas Datenrahmen über eine Schleife zu erstellen und zu speichern. Jedes Diagramm sollte eine identische x-Achse, aber unterschiedliche Längen und Beschriftungen der y-Achse haben. Ich habe kein Problem damit, die Plots mit unterschiedlichen y-Achsenlängen und Beschriftungen zu erstellen und zu speichern, aber wenn ich die Plots erstelle, skaliert matplotlib die x-Achse neu, je nachdem wie viel Platz für die y-Achsenbeschriftungen auf der linken Seite benötigt wird Zahl.Machen x-Achsen aller Unterplots gleiche Länge auf der Seite
Diese Zahlen sind für einen technischen Bericht. Ich plane, eine auf jeder Seite des Berichts zu platzieren, und ich möchte, dass alle X-Achsen den gleichen Platz auf der Seite einnehmen.
Hier ist eine MSPaint-Version von dem, was ich bekomme und was ich gerne bekommen würde.
Hoffentlich ist das genug Code, um zu helfen. Ich bin sicher, dass es viele nicht optimale Teile davon gibt.
import pandas as pd
import matplotlib.pyplot as plt
import pylab as pl
from matplotlib import collections as mc
from matplotlib.lines import Line2D
import seaborn as sns
# elements for x-axis
start = -1600
end = 2001
interval = 200 # x-axis tick interval
xticks = [x for x in range(start, end, interval)] # create x ticks
# items needed for legend construction
lw_bins = [0,10,25,50,75,90,100] # bins for line width
lw_labels = [3,6,9,12,15,18] # line widths
def make_proxy(zvalue, scalar_mappable, **kwargs):
color = 'black'
return Line2D([0, 1], [0, 1], color=color, solid_capstyle='butt', **kwargs)
# generic image ID
img_path = r'C:\\Users\\user\\chart'
img_ID = 0
for line_subset in data:
# create line collection for this run through loop
lc = mc.LineCollection(line_subset)
# create plot and set properties
sns.set(style="ticks")
sns.set_context("notebook")
fig, ax = pl.subplots(figsize=(16, len(line_subset)*0.5)) # I want the height of the figure to change based on number of labels on y-axis
# Figure width should stay the same
ax.add_collection(lc)
ax.set_xlim(left=start, right=end)
ax.set_xticks(xticks)
ax.set_ylim(0, len(line_subset)+1)
ax.margins(0.05)
sns.despine(left=True)
ax.xaxis.set_ticks_position('bottom')
ax.set_yticks(line_subset['order'])
ax.set_yticklabels(line_subset['ylabel'])
ax.tick_params(axis='y', length=0)
# legend
proxies = [make_proxy(item, lc, linewidth=item) for item in lw_labels]
ax.legend(proxies, ['0-10%', '10-25%', '25-50%', '50-75%', '75-90%', '90-100%'], bbox_to_anchor=(1.05, 1.0),
loc=2, ncol=2, labelspacing=1.25, handlelength=4.0, handletextpad=0.5, markerfirst=False,
columnspacing=1.0)
# title
ax.text(0, len(line_subset)+2, s=str(img_ID), fontsize=20)
# save as .png images
plt.savefig(r'C:\\Users\\user\\Desktop\\chart' + str(img_ID) + '.png', dpi=300, bbox_inches='tight')
Gibt es eine justieren Möglichkeit, die X-Achse zu speichern, damit ich sie beim nächsten Durchlauf durch die Schleife verwenden kann? Ich will nicht alle Plots auf einer zusammenhängenden Figur haben; Sie müssen als einzelne .png-Dateien gespeichert werden. – jdep
Sie können x Begrenzungen in einer Temp-Variable speichern. Sagen wir mal von nullter Lauf und wenden es für den nächsten Lauf an (erster Lauf). Möglicherweise haben Sie jedoch das Problem, dass Sie beim zweiten Lauf vom ersten Lauf an Grenzwerte anwenden. das magst du nicht wollen. – plasmon360