简体   繁体   中英

Line plot with marker at final point

I am looking to produce a graph plotting the points of particles under the action of gravity and am currently producing a plot as below:

在此处输入图像描述

However, I would like to produce a clearer plot showing a line for the path of the particles and a marker at the final point indicating their final positions, like in the plot below: 在此处输入图像描述

My current line of code plotting each line is:

plt.plot(N_pos[:,0] * AU, N_pos[:,1], 'o')

This just plots the x and y coordinate from an array listing the x, y and z coordinate for each particle

Is the simplest way to do this remove the 'o' marker from the code and just plot the last position of each particle again but this time using a marker? If so, how to I make the line and final marker the same colour instead of like below?:

在此处输入图像描述

for i in range(len(all_positions[0])):
    N_pos = all_positions[:,i]
    plt.plot(N_pos[:,0] , N_pos[:,1])
    plt.plot(N_pos[:,0][-1] , N_pos[:,1][-1], 'o')

When no explicit color is given, plt.plot() cycles through a list of default colors. A simple solution would be to extract the color from the lineplot and provide it as the color for the dot:

import numpy as np
import matplotlib.pyplot as plt

a = np.random.randn(200, 10, 1).cumsum(axis=0) * 0.1
all_positions = np.dstack([np.sin(a), np.cos(a)]).cumsum(axis=0)

for i in range(len(all_positions[0])):
    N_pos = all_positions[:, i]
    line, = plt.plot(N_pos[:, 0], N_pos[:, 1])
    plt.plot(N_pos[:, 0][-1], N_pos[:, 1][-1], 'o', color=line.get_color())
plt.show()

示例图

Another option would be to create a scatter plot, and set the size of the dots via an array. For example, N-1 times 1 and one time 20 :

for i in range(len(all_positions[0])):
    N_pos = all_positions[:, i]
    plt.scatter(N_pos[:, 0], N_pos[:, 1], s=np.append(np.ones(len(N_pos) - 1), 20))

You can define your own color palette and give each trace its unique(ish) color:

import numpy as np
import matplotlib.pyplot as plt
from matplotlib import cm

np.random.random(123)
all_positions = np.random.randn(10, 5, 2).cumsum(axis=0) #shamelessly stolen from JohanC
l = all_positions.shape[1]

my_cmap = cm.plasma

for i in range(l):
    N_pos = all_positions[:,i]
    plt.plot(N_pos[:,0], N_pos[:,1], c= my_cmap(i/l))
    plt.plot(N_pos[:,0][-1], N_pos[:,1][-1], 'o', color=my_cmap(i/l))

plt.show()

Output: 在此处输入图像描述

You can reset the color cycler and plot the markers in a second round (not recommended, just to illustrate cycler properties ):

import numpy as np
import matplotlib.pyplot as plt

np.random.random(123)
all_positions = np.random.randn(10, 5, 2).cumsum(axis=0)
l = all_positions.shape[1]

for i in range(l):
    N_pos = all_positions[:,i]
    plt.plot(N_pos[:,0], N_pos[:,1])

plt.gca().set_prop_cycle(None)
    
for i in range(l):
    N_pos = all_positions[:,i]
    plt.plot(N_pos[:,0][-1], N_pos[:,1][-1], 'o')

plt.show()

Sample output: 在此处输入图像描述

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM