我是matplotlib的新手,尝试通过循环创建并保存来自pandas数据框的图。每个绘图应该具有相同的x轴,但不同的y轴长度和标签。创建并保存具有不同y轴长度和标签的曲线图时,我没有问题,但是当我创建曲线图时,matplotlib重新调整x轴的大小,具体取决于曲线左侧的y轴标签需要多少空间数字。使页面上所有子图的x轴长度相同
这些数字是用于技术报告的。我计划在报告的每个页面上放置一个,我希望所有的x轴在页面上占用相同的空间量。
希望这是足够的代码来帮助。我确定有很多非最优化的部分。
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')
调整的插曲之外的间距是否有存储x轴的方式,以便我可以在循环的下一次运行中使用它?我不想把所有的情节都放在一个连续的数字上;他们需要保存为单独的.png文件。 – jdep
您可以在临时变量中存储x个限制。让我们从第零次运行开始,并将其应用于下一次运行(第一次运行)。但是你可能会遇到这样的问题,即第二次运行时,你将会从第一次运行中采用限制。你可能不希望这样。 – plasmon360