Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Handle HiDPI displays in WebAgg/NbAgg backends#5383

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to ourterms of service andprivacy statement. We’ll occasionally send you account related emails.

Already on GitHub?Sign in to your account

Merged
jenshnielsen merged 9 commits intomatplotlib:masterfrommdboom:hidpi-nbagg
Dec 10, 2015

Conversation

mdboom
Copy link
Member

Fix#5381.

Tested on Firefox/Chrome/Safari on Linux/Mac. Anyone able to do Windows testing?

@mdboommdboom added this to thenext bug fix release (2.0.1) milestoneNov 2, 2015
@@ -342,7 +355,7 @@ def handle_event(self, event):

def handle_resize(self, event):
x, y = event.get('width', 800), event.get('height', 800)
x, y = int(x), int(y)
x, y = int(x) * 2, int(y) * 2
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others.Learn more.

Should there be this hard-coded 2 here, notself.canvas._dpi_ratio?

Copy link
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others.Learn more.

Indeed. Good catch.

@mdboom
Copy link
MemberAuthor

Rebased

@WeatherGod
Copy link
Member

Does this work correctly if the user changes the DPI (not even really sure if that is possible anyway). The way I see it, the original dpi could never get updated?

@mdboom
Copy link
MemberAuthor

With Chrome, I can't find a way to change the "devicePixelScale" dynamically. It can be set with a commandline argument, but that implies restarting the browser.

With Firefox, it can be set dynamically throughabout:config:layout.css.devPixelsPerPx. In that case, the plot scales up with pixelation, which is fine. It's theoretically possible to catch that and start regenerating the images at a higher resolution, but that seems like a real corner case given that the user has to visit the "void your warranty" about:config page.

This also performs fine underCtrl + andCtrl - scaling, though the plot is pixelated at the higher scales. Thatmight be something worth trying to fix, but it doesn't exactly feel broken as it is, either.

@jenshnielsen
Copy link
Member

If I move a window from my external Non high dpi to my internal Retina monitor
window.devicePixelRatio changes from 1 to 2 as expected I guess you would need to regenerate the image if you change monitor. I.e. unplug external monitor

@mdboom
Copy link
MemberAuthor

@jenshnielsen: That's a good point. I only have HiDPI monitors. I'd be curious what happens for you if you're able to test that. My best guess is that if you move from lodpi to hidpi the image will be pixelated. If you move from hidpi to lodpi the image will be downsampled (but appear at a reasonable total size). Neither of which are the end of the world.

I guess we could try to trap the change and adapt on the fly. It seems at least theoretically possible:https://stackoverflow.com/questions/28905420/window-devicepixelratio-change-listener

@jenshnielsen
Copy link
Member

If I understand the code correctly it will get the DPI every time a new figure is created?
I think that recreating the figure to get the correct dpi when changing is perfectly fine as long as it doesn't require restarting the notebook or some such thing. Unfortunately I only have a non hiDPI monitor in the office so I will have to wait with testing that till tomorrow.

Otherwise this is really nice 👍 however there seems to be a bug in the conversion from low to high when zooming on a highDPI screen. When drawing a zoom box it seems to get the coordinates in the mixed up and zoom to the corner. I guess there is a multiplication by dpi missing somewhere

@jenshnielsen
Copy link
Member

This also manifests it self in that the coordinates in the lower right corner are wrong.
Also when stopping a figure on a highDP screen the static figure is much larger than the original

@mdboom
Copy link
MemberAuthor

I've fixed the issues with the coordinates and the rubberband.

This still has potential issues when moving the browser from a lo to hi-res screen, but I don't have a way of testing that.

@jenshnielsen
Copy link
Member

Thanks I will test out the moving when I'm back with my external monitors

@jenshnielsen
Copy link
Member

Did some testing.

  • When you move a non highdp figure to a high dp display it is non highdp until the figure is recreated.
  • When you move a highdp figure to a non highdp display it is slightly more fuzzy until the figure is recreated

I think this is fine and there is no need to do anything more elaborate.

Did you push the fix for rubberband? I dont see the any commits newer thand0b16a1 which is 12 days old

@mdboom
Copy link
MemberAuthor

Sorry -- recent changes pushed now.

@jenshnielsen
Copy link
Member

The rubberband and coordinates look right now.

I am still seeing the issue where the figure grows in size when stopped and converted to a static figure. I guess the right dpi is not set for the static figure.

@mdboom
Copy link
MemberAuthor

Ah -- See that DPI change now, too. Let me see what can be done. At least for me, the static figure is scaled up by the browser (i.e. not using the full DPI of the display). We should fix that, but I suspect that might require tweaking something in IPython.

@jenshnielsen
Copy link
Member

IPython at least used to have some hidpi supportipython/ipython#3381 not sure where that lives now

@mdboom
Copy link
MemberAuthor

I see -- maybe we can add that flag for the user, since we already know they are retina. (Of course, multiple clients connected to the same kernel will be a problem -- but we have that problem in NbAgg anyway).

@mdboommdboom modified the milestones:next major release (2.0),next bug fix release (2.0.1)Dec 6, 2015
@jenshnielsen
Copy link
Member

I was playing around with this and it seems to me that we can solve it by doing something like
changing handle_close to:

mpl.figure.prototype.handle_close=function(fig,msg){varwidth=fig.canvas.width/mpl.ratiofig.root.unbind('remove')// Update the output cell to use the data from the current canvas.fig.push_to_output();vardataURL=fig.canvas.toDataURL();// Re-enable the keyboard manager in IPython - without this line, in FF,// the notebook keyboard shortcuts fail.IPython.keyboard_manager.enable()$(fig.parent_element).html('<img src="'+dataURL+'" width="'+width+'">');fig.close_ws(fig,msg);}

I.E explicitly setting the width according to the dpi ratio. This obviously needs some more work

@jenshnielsen
Copy link
Member

And a similar modification in push_to_output

mpl.figure.prototype.push_to_output=function(remove_interactive){// Turn the data on the canvas into data in the output cell.varwidth=this.canvas.width/mpl.ratiovardataURL=this.canvas.toDataURL();this.cell_info[1]['text/html']='<img src="'+dataURL+'" width="'+width+'">';}

This ensures that the figure size remains the same following a closure of the figure regardless of display dpi
@jenshnielsen
Copy link
Member

I put in a pull request with the changes inmdboom#15

With those changes I think this is ready to go

Set witdh of non interactive figure in nbagg backend.
@jenshnielsen
Copy link
Member

Im happy to merge this now. It is tagged agains 2.0 but I'm not sure if we want to backport it?

jenshnielsen added a commit that referenced this pull requestDec 10, 2015
Handle HiDPI displays in WebAgg/NbAgg backends
@jenshnielsenjenshnielsen merged commit0a08ceb intomatplotlib:masterDec 10, 2015
@jenshnielsen
Copy link
Member

Happy to backport if anyone thins we should

@mdboom
Copy link
MemberAuthor

I can see this going either way for backporting.@tacaswell: Wanna be the tie-breaker?

@tacaswell
Copy link
Member

👍 to backporting. It isn't a new plotting feature, it is fixing what is arguably a bug in nbagg on retina

jenshnielsen added a commit to jenshnielsen/matplotlib that referenced this pull requestAug 18, 2016
Handle HiDPI displays in WebAgg/NbAgg backends
tacaswell added a commit that referenced this pull requestAug 20, 2016
Backport#5383 Needed for retina support in ipympl
QuLogic pushed a commit to QuLogic/matplotlib that referenced this pull requestOct 16, 2016
Handle HiDPI displays in WebAgg/NbAgg backends
@QuLogic
Copy link
Member

Backported to v2.x via#6956.

QuLogic added a commit to QuLogic/matplotlib that referenced this pull requestOct 16, 2016
…dpi-nbagg"This reverts commit9111ee2. Theindividual changelog file was already merged into the main one.
@QuLogicQuLogic mentioned this pull requestNov 24, 2016
Sign up for freeto join this conversation on GitHub. Already have an account?Sign in to comment
Reviewers
No reviews
Assignees
No one assigned
Projects
None yet
Milestone
v2.0.0
Development

Successfully merging this pull request may close these issues.

5 participants
@mdboom@WeatherGod@jenshnielsen@tacaswell@QuLogic

[8]ページ先頭

©2009-2025 Movatter.jp