How I can get cartesian coordinate system in matplotlib?

后端 未结 5 755
悲哀的现实
悲哀的现实 2020-12-03 07:11

I am new to plotting with Python and can\'t really find an answer to the question: How can I get Cartesian coordinate plane in matplotlib? By this I mean perpendicular refe

相关标签:
5条回答
  • 2020-12-03 07:55

    The code below will give you a Cartesian plane.

    import matplotlib.pyplot as plt
    
    
    def build_cartesian_plane(max_quadrant_range):
        """ The quadrant range controls the range of the quadrants"""
        l = []
        zeros = []
        plt.grid(True, color='b', zorder=0,)
        ax = plt.axes()
        head_width = float(0.05) * max_quadrant_range
        head_length = float(0.1) * max_quadrant_range
        ax.arrow(0, 0, max_quadrant_range, 0, head_width=head_width, head_length=head_length, fc='k', ec='k',zorder=100)
        ax.arrow(0, 0, -max_quadrant_range, 0, head_width=head_width, head_length=head_length, fc='k', ec='k', zorder=100)
        ax.arrow(0, 0, 0, max_quadrant_range, head_width=head_width, head_length=head_length, fc='k', ec='k', zorder=100)
        ax.arrow(0, 0, 0, -max_quadrant_range, head_width=head_width, head_length=head_length, fc='k', ec='k', zorder=100)
        counter_dash_width = max_quadrant_range * 0.02
        dividers = [0,.1,.2,.3,.4, .5, .6, .7, .8, .9, 1]
        for i in dividers:
            plt.plot([-counter_dash_width, counter_dash_width], [i*max_quadrant_range, i*max_quadrant_range], color='k')
            plt.plot([i * max_quadrant_range, i*max_quadrant_range], [-counter_dash_width, counter_dash_width], color='k')
            plt.plot([-counter_dash_width, counter_dash_width], [-i * max_quadrant_range, -i * max_quadrant_range], color='k')
            plt.plot([-i * max_quadrant_range, -i * max_quadrant_range], [-counter_dash_width, counter_dash_width], color='k')
            l.append(i * max_quadrant_range)
            l.append(-i * max_quadrant_range)
            zeros.append(0)
            zeros.append(0)
    
    
    build_cartesian_plane(10)
    plt.show()
    

    Example output from the code

    0 讨论(0)
  • 2020-12-03 08:02

    If you just want to plot some dots, scatter is what you want

    from pylab import *
    
    x = [0,2,-3,-1.5]
    y = [0,3,1,-2.5]
    color=['m','g','r','b']
    
    scatter(x,y, s=100 ,marker='o', c=color)
    
    show()
    

    For pretty printing ( with arrows and dashed lines ) :

    from pylab import *
    import matplotlib.pyplot as plt
    
    x = [0,2,-3,-1.5]
    y = [0,3,1,-2.5]
    color=['m','g','r','b']
    
    fig = plt.figure()
    ax = fig.add_subplot(111)
    
    scatter(x,y, s=100 ,marker='o', c=color)
    
    [ plot( [dot_x,dot_x] ,[0,dot_y], '-', linewidth = 3 ) for dot_x,dot_y in zip(x,y) ] 
    [ plot( [0,dot_x] ,[dot_y,dot_y], '-', linewidth = 3 ) for dot_x,dot_y in zip(x,y) ]
    
    left,right = ax.get_xlim()
    low,high = ax.get_ylim()
    arrow( left, 0, right -left, 0, length_includes_head = True, head_width = 0.15 )
    arrow( 0, low, 0, high-low, length_includes_head = True, head_width = 0.15 ) 
    
    grid()
    
    show()
    

    There is still some work to do, but it is not far from the result :

    enter image description here

    0 讨论(0)
  • 2020-12-03 08:05

    Here is another way to draw a Cartesian coordinate system, built on the answers already given by others.

    import matplotlib.pyplot as plt
    import numpy as np
    
    fig, ax = plt.subplots(figsize=(10, 10))
    
    # Enter x,y coordinates and colors of points
    x = [0, 2, -3, -1.5]
    y = [0, 3, 1, -2.5]
    color = ['m', 'g', 'r', 'b']
    
    # Select length of axes and the space between tick labels
    xmin, xmax, ymin, ymax = -5, 5, -5, 5
    ticks_frequency = 1
    
    # Plot points
    ax.scatter(x, y, c=color)
    
    # Draw lines connecting points to axes
    [ax.plot([dot_x, dot_x], [0, dot_y], c=c, ls='--', lw=1.5, alpha=0.5) for dot_x, dot_y, c in zip(x, y, color)] 
    [ax.plot([0, dot_x], [dot_y, dot_y], c=c, ls='--', lw=1.5, alpha=0.5) for dot_x, dot_y, c in zip(x, y, color)]
    
    # Set identical scales for both axes
    ax.set(xlim=(xmin-1, xmax+1), ylim=(ymin-1, ymax+1), aspect='equal')
    
    # Set bottom and left spines as x and y axes of coordinate system
    ax.spines['bottom'].set_position('zero')
    ax.spines['left'].set_position('zero')
    
    # Remove top and right spines
    ax.spines['top'].set_visible(False)
    ax.spines['right'].set_visible(False)
    
    # Create 'x' and 'y' labels placed at the end of the axes
    ax.set_xlabel('x', size=14, labelpad=15)
    ax.set_ylabel('y', size=14, labelpad=15, rotation=0)
    ax.xaxis.set_label_coords(1.03, 0.512)
    ax.yaxis.set_label_coords(0.5, 1.02)
    
    # Create custom tick labels
    x_ticks = np.arange(xmin, xmax+1, ticks_frequency)
    x_ticks_major = x_ticks[x_ticks != 0]
    y_ticks = np.arange(ymin, ymax+1, ticks_frequency)
    y_ticks_major = y_ticks[y_ticks != 0]
    ax.set_xticks(x_ticks_major)
    ax.set_yticks(y_ticks_major)
    ax.set_xticks(np.arange(xmin,xmax+1), minor=True)
    ax.set_yticks(np.arange(ymin,ymax+1), minor=True)
    
    # Draw grid lines
    ax.grid(which='major', color='grey', linewidth=1, linestyle='-', alpha=0.2)
    ax.grid(which='minor', color='grey', linewidth=1, linestyle='-', alpha=0.2)
    
    # Draw arrows
    ax.plot((1), (0), linestyle="", marker=">", markersize=4, color="k",
            transform=ax.get_yaxis_transform(), clip_on=False)
    ax.plot((0), (1), linestyle="", marker="^", markersize=4, color="k",
            transform=ax.get_xaxis_transform(), clip_on=False)
    
    plt.show()
    

    Cartesian coordinate system

    Notice that I have not added annotations displaying the coordinates of the points as in my experience this requires a lot more code to place them nicely and with minimal overlapping. To get annotations, it is probably easier to use an interactive graphing library such as Plotly.

    0 讨论(0)
  • 2020-12-03 08:06

    This is an old question, but I think with today's matplotlib versions, the keyword is spines. You would do:

    ax = plt.gca()
    ax.spines['top'].set_color('none')
    ax.spines['bottom'].set_position('zero')
    ax.spines['left'].set_position('zero')
    ax.spines['right'].set_color('none')
    

    The link provides more examples.

    0 讨论(0)
  • 2020-12-03 08:07

    I think this example in the matplotlib gallery should get you close enough: http://matplotlib.org/examples/axes_grid/demo_axisline_style.html

    0 讨论(0)
提交回复
热议问题