I created a Plot with the Python
library Bokeh
(see code).
from bokeh.plotting import *
figure()
hold()
rect([1,3], [1,1], [1,0.5], [1,0.5])
patch([0,0,4,4], [2,0,0,2], line_color="black", fill_color=None)
show()
How can I represent the squares (rectangle with the same width and height) with equal axes as in matplotlib with the command axis('equal')
?
http://matplotlib.org/examples/pylab_examples/axis_equal_demo.html
I see the option to change the width and height of the plot or define the axis range to solve this problem but I think, there should be a smarter alternative.
NOTE: I'm using Python v.2.7.8
and Bokeh v.0.6.1
.
With Bokeh's bokeh. plotting interface, you can add more glyphs to your plot: To add more line graphs to your plot, all you need to do is call the line() function multiple times. In this example, you also assign a different color to each of the lines by passing a different named color to each line's color argument.
You can display images on Bokeh plots using the image() , image_rgba() , and image_url() glyph methods. You can use hovering tooltips with image glyphs to let the user see the values of each pixel.
You can hide the lines by setting their grid_line_color to None .
Bokeh is a Python library for creating interactive visualizations for modern web browsers. It helps you build beautiful graphics, ranging from simple plots to complex dashboards with streaming datasets. With Bokeh, you can create JavaScript-powered visualizations without writing any JavaScript yourself.
As of Bokeh 0.12.7, this feature has been implemented. Plots can now accept two new properties.
match_aspect
which, when set to true, will match the aspect of the data space to the pixel space of the plot. For example, squares drawn in data units will now be perfect squares in pixel units as well.
p = figure(match_aspect=True)
p.circle([-1, +1, +1, -1], [-1, -1, +1, +1])
aspect_scale
allows you to further control the aspect ratio by specifying a multiplier on top of the aspect correction made by match_aspect
.
p = figure(aspect_scale=2)
p.circle([-1, +1, +1, -1], [-1, -1, +1, +1])
p = figure(aspect_scale=0.5)
p.circle([-1, +1, +1, -1], [-1, -1, +1, +1])
Sadly it seems that two years later this feature is still missing. As a workaround, I have written a function that sets the x_range
and y_range
properties of a figure appropriately to display your data with a given aspect ratio. This works fine as long as you don't allow any tools like box zoom that let the user modify the aspect ratio.
__all__ = ['set_aspect']
from bokeh.models import Range1d
def set_aspect(fig, x, y, aspect=1, margin=0.1):
"""Set the plot ranges to achieve a given aspect ratio.
Args:
fig (bokeh Figure): The figure object to modify.
x (iterable): The x-coordinates of the displayed data.
y (iterable): The y-coordinates of the displayed data.
aspect (float, optional): The desired aspect ratio. Defaults to 1.
Values larger than 1 mean the plot is squeezed horizontally.
margin (float, optional): The margin to add for glyphs (as a fraction
of the total plot range). Defaults to 0.1
"""
xmin = min(xi for xi in x)
xmax = max(xi for xi in x)
ymin = min(yi for yi in y)
ymax = max(yi for yi in y)
width = (xmax - xmin)*(1+2*margin)
if width <= 0:
width = 1.0
height = (ymax - ymin)*(1+2*margin)
if height <= 0:
height = 1.0
xcenter = 0.5*(xmax + xmin)
ycenter = 0.5*(ymax + ymin)
r = aspect*(fig.plot_width/fig.plot_height)
if width < r*height:
width = r*height
else:
height = width/r
fig.x_range = Range1d(xcenter-0.5*width, xcenter+0.5*width)
fig.y_range = Range1d(ycenter-0.5*height, ycenter+0.5*height)
if __name__ == '__main__':
from bokeh.plotting import figure, output_file, show
x = [-1, +1, +1, -1]
y = [-1, -1, +1, +1]
output_file("bokeh_aspect.html")
p = figure(plot_width=400, plot_height=300, tools='pan,wheel_zoom',
title="Aspect Demo")
set_aspect(p, x, y, aspect=2)
p.circle(x, y, size=10)
show(p)
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With