fix: Modify font size when unable to fit in plot
This prevents scenarios where text without line breaks will start overlapping with each other when generating X/Y plots. This is most evident when generating X/Y plots with checkpoints, as most don't contain spaces and sometimes include extra information such as the epoch, making it extra long.
This commit is contained in:
parent
685f9631b5
commit
b7c478c3eb
1 changed files with 16 additions and 7 deletions
|
@ -136,8 +136,19 @@ def draw_grid_annotations(im, width, height, hor_texts, ver_texts):
|
||||||
lines.append(word)
|
lines.append(word)
|
||||||
return lines
|
return lines
|
||||||
|
|
||||||
def draw_texts(drawing, draw_x, draw_y, lines):
|
def get_font(fontsize):
|
||||||
|
try:
|
||||||
|
return ImageFont.truetype(opts.font or Roboto, fontsize)
|
||||||
|
except Exception:
|
||||||
|
return ImageFont.truetype(Roboto, fontsize)
|
||||||
|
|
||||||
|
def draw_texts(drawing, draw_x, draw_y, lines, initial_fnt, initial_fontsize):
|
||||||
for i, line in enumerate(lines):
|
for i, line in enumerate(lines):
|
||||||
|
fnt = initial_fnt
|
||||||
|
fontsize = initial_fontsize
|
||||||
|
while drawing.multiline_textsize(line.text, font=fnt)[0] > line.allowed_width and fontsize > 0:
|
||||||
|
fontsize -= 1
|
||||||
|
fnt = get_font(fontsize)
|
||||||
drawing.multiline_text((draw_x, draw_y + line.size[1] / 2), line.text, font=fnt, fill=color_active if line.is_active else color_inactive, anchor="mm", align="center")
|
drawing.multiline_text((draw_x, draw_y + line.size[1] / 2), line.text, font=fnt, fill=color_active if line.is_active else color_inactive, anchor="mm", align="center")
|
||||||
|
|
||||||
if not line.is_active:
|
if not line.is_active:
|
||||||
|
@ -148,10 +159,7 @@ def draw_grid_annotations(im, width, height, hor_texts, ver_texts):
|
||||||
fontsize = (width + height) // 25
|
fontsize = (width + height) // 25
|
||||||
line_spacing = fontsize // 2
|
line_spacing = fontsize // 2
|
||||||
|
|
||||||
try:
|
fnt = get_font(fontsize)
|
||||||
fnt = ImageFont.truetype(opts.font or Roboto, fontsize)
|
|
||||||
except Exception:
|
|
||||||
fnt = ImageFont.truetype(Roboto, fontsize)
|
|
||||||
|
|
||||||
color_active = (0, 0, 0)
|
color_active = (0, 0, 0)
|
||||||
color_inactive = (153, 153, 153)
|
color_inactive = (153, 153, 153)
|
||||||
|
@ -178,6 +186,7 @@ def draw_grid_annotations(im, width, height, hor_texts, ver_texts):
|
||||||
for line in texts:
|
for line in texts:
|
||||||
bbox = calc_d.multiline_textbbox((0, 0), line.text, font=fnt)
|
bbox = calc_d.multiline_textbbox((0, 0), line.text, font=fnt)
|
||||||
line.size = (bbox[2] - bbox[0], bbox[3] - bbox[1])
|
line.size = (bbox[2] - bbox[0], bbox[3] - bbox[1])
|
||||||
|
line.allowed_width = allowed_width
|
||||||
|
|
||||||
hor_text_heights = [sum([line.size[1] + line_spacing for line in lines]) - line_spacing for lines in hor_texts]
|
hor_text_heights = [sum([line.size[1] + line_spacing for line in lines]) - line_spacing for lines in hor_texts]
|
||||||
ver_text_heights = [sum([line.size[1] + line_spacing for line in lines]) - line_spacing * len(lines) for lines in
|
ver_text_heights = [sum([line.size[1] + line_spacing for line in lines]) - line_spacing * len(lines) for lines in
|
||||||
|
@ -194,13 +203,13 @@ def draw_grid_annotations(im, width, height, hor_texts, ver_texts):
|
||||||
x = pad_left + width * col + width / 2
|
x = pad_left + width * col + width / 2
|
||||||
y = pad_top / 2 - hor_text_heights[col] / 2
|
y = pad_top / 2 - hor_text_heights[col] / 2
|
||||||
|
|
||||||
draw_texts(d, x, y, hor_texts[col])
|
draw_texts(d, x, y, hor_texts[col], fnt, fontsize)
|
||||||
|
|
||||||
for row in range(rows):
|
for row in range(rows):
|
||||||
x = pad_left / 2
|
x = pad_left / 2
|
||||||
y = pad_top + height * row + height / 2 - ver_text_heights[row] / 2
|
y = pad_top + height * row + height / 2 - ver_text_heights[row] / 2
|
||||||
|
|
||||||
draw_texts(d, x, y, ver_texts[row])
|
draw_texts(d, x, y, ver_texts[row], fnt, fontsize)
|
||||||
|
|
||||||
return result
|
return result
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue