Align vinculum of fractions using minus sign instead of equals sign #20627
Conversation
The alignment may seem to be off by a pixel in some of the fractions, but I believe that is because of the limitations of the PNG format. If the images are saved using the SVG format, it is clear (upon zooming in) that the alignment is correct. Here's the test code.
|
Thank you for opening your first PR into Matplotlib!
If you have not heard from us in a while, please feel free to ping @matplotlib/developers
or anyone who has commented on the PR. Most of our reviewers are volunteers and sometimes things fall through the cracks.
You can also join us on gitter for real-time discussion.
For details on testing, writing docs, and our review process, please see the developer guide
We strive to be a welcoming and open project. Please follow our Code of Conduct.
Thanks @tfpf. The result indeed seems correct. Considering the unicode minus is the right thing to do. I'm not a font guy, and I don't understand the details behind the calculation. Do you know why there is the thickness * x
subtraction, and why x=1.5
is the correct value rather than x=3
? Or is this just an empirical observation?
On a side note, several reference images have changed, which seems expected (but I did not have a look at them). I think we'll have to regenerate them.
@timhoffm I wasn't sure if I'd be able to describe it properly, so I attached an image. Here,
The first thing I noticed was that the space between the numerator and the vinculum is not the same as the space between the denominator and the vinculum. According to the source code (lines 2768 to 2770), both should be With that in mind,
|
Latex gives us: which is substantially different than what we have currently, or with this change. Note that the I'm not sure if half fixing this is worth breaking so many images? |
The true algorithm is in the TeX book linked here. I tried a few things that didn't quite get all the way there, but maybe with this it would work? |
Lets pop this to draft: @tfpf not sure how feasible it is for you to look into a more holistic approach here? If not, then it seems maybe we should get it right rather than whack-a-mole with different alignments? |
That makes sense. I'll see if I can come up with a better solution. |
That sure looks better. Thanks for looking at this so carefully - very much appreciated, as this was a lot more work than a quick change at this point. Lets see how the tests shake out, and then hopefully there aren't any edge cases that this is not working on. |
Almost all image comparison tests involving fractions will fail, though. Won't they? Also, in hindsight, I guess |
For sure it will break the image tests. I just meant that hopefully it breaks them correctly ;-) |
@tfpf When you get the new images, please include them as part of the PR (usually by copying from |
I skimmed through a few image miscompares. For
The alignment of it immediately becomes clear that the problem isn't the alignment of the fraction, but the alignment (or perhaps the rendering) of the plus sign. It's off by just one pixel, but looks like a big change because of the font size. I think this will significantly affect the image comparison tests: even if we get the alignment right, it'll look wrong at small font sizes. ETA: @jklymak Apologies, I didn't see your comment. What do you think about this? Should I include the images in the PR in spite of this rendering problem? |
I'd be careful with 1-pixel changes. Matplotlib does funny things at pixel resolution like snapping lines to the nearest pixel. It looks possible to me that it is doing that for the fraction lines. Can you turn snapping off for those, at least as a test of the algorithm? |
Passing |
I'm not familiar enough with the math mode to know. Maybe it's just hard coded in? |
Okay, I found something interesting. And this is despite using the Agg backend. As for it being hardcoded, I am not sure, either. I haven't studied the source code apart from the |
I get yelled at for this, but I'm not too fussed about 1-pixel offsets - publication quality is 300 dpi or above. As long as it looks good at 200 dpi, I would not block on inconsistencies down at 100 dpi for such tiny fonts. Unless I pixel-peep I can't really see the differences in the above two examples, other than the "expected" looks cramped. |
All right, then. I want to take a look at some more image miscompares. For the next commit, I will add the images along with code changes (if any). |
Looks like I accidentally committed all images which changed (1048 out of 1488) instead of just the ones flagged by pytest as mismatches (nearly 200). Should I undo the previous commit and add only the latter? |
Yes please. |
@matplotlib/developers Could someone take a look at the changes and review them? |
@tfpf they are still not passing the tests, so not yet reviewable.... |
There are some SVG miscompares, but I can't reproduce them on my machine. Pytest skips the SVG comparison tests. I tried installing Matplotlib as mentioned in the contributing guidelines. Even tried supplying
Any suggestions on what I did wrong will be appreciated. |
I think svg requires a blessed version of inkscape? I'm not sure what to do about the pngs that snap the fraction line to the wrong pixel and make the new pngs look worse than the old. There are a lot of these pngs, but it really seems like they should "work" and maybe need to be larger? Not sure what other folks think. Conversely we could drop the pngs altogether (if we think mathtext pngs are adequately tested) and just look at the pdfs and svgs. I guess I'm ignorant as to whether we need all three file types or just pdf would work? |
All images have now been added. Also, the part which chooses between the unicode minus sign and the hyphen has been removed. I believe that this is the right thing to do, because:
I thought doing this would fix the code coverage test failure, but (curiously) it didn't, so I wonder if it's due to something else. Lastly, there's the CircleCI failure. According to the log, an error was encountered after embedding documentation hyperlinks, and I don't see any more info. The pull request guidelines state that
but I haven't changed any docs! This is the relevant line.
|
Any info on this? |
Suggest you rebase on master. Maybe there was a temporary bug that snuck into master? |
PR Summary
This PR attempts to fix the vertical alignment of fractions. The horizontal line separating the numerator from the denominator should be at the same level as a minus sign (if it were present). Currently, the alignment uses the equals sign.
The fraction always appears slightly below where it should.

With this fix, the alignment is a little less shabby.

PR Checklist
pytest
passes).flake8-docstrings
and runflake8 --docstring-convention=all
).doc/users/next_whats_new/
(follow instructions in README.rst there).doc/api/next_api_changes/
(follow instructions in README.rst there).The text was updated successfully, but these errors were encountered: