0

Disclaimer: I'm a total newb to this, 2nd day so pls bear with me, thank you in advance!

So, I managed to get my 3D plot to have multiple lines, but I would like to give them some color gradients. I've managed to get it onto one example line, but I cannot convert it to my own plots.

My plots come from a .csv

I followed this question for the gradients: https://stackoverflow.com/a/8505774/20387853 (Answer by Yann) but I can't seem to understand how to merge the two for i in range bits (one from my old code with the new code) (if it even can be?)

I also dont understand ax.plot(x[i:i+2],y[i:i+2]) so I couldn't adjust this like I thought I could.

SO ATM i have two scripts

Script 1 - in which I'm trying to merge my two data sets.

import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
import sys
import pandas


points = pandas.read_csv('D:Documents\PYTHON_FILES/test3d.csv')

def highResPoints(x,y,factor=10):
    

    # r is the distance spanned between pairs of points
    r = [0]
    for i in range(1,len(x)):
        dx = x[i]-x[i-1]
        dy = y[i]-y[i-1]
        r.append(np.sqrt(dx*dx+dy*dy))
    r = np.array(r)

    # rtot is a cumulative sum of r, it's used to save time
    rtot = []
    for i in range(len(r)):
        rtot.append(r[0:i].sum())
    rtot.append(r.sum())

    dr = rtot[-1]/(NPOINTS*RESFACT-1)
    xmod=[x[0]]
    ymod=[y[0]]
    rPos = 0 # current point on walk along data
    rcount = 1 
    while rPos < r.sum():
        x1,x2 = x[rcount-1],x[rcount]
        y1,y2 = y[rcount-1],y[rcount]
        dpos = rPos-rtot[rcount] 
        theta = np.arctan2((x2-x1),(y2-y1))
        rx = np.sin(theta)*dpos+x1
        ry = np.cos(theta)*dpos+y1
        xmod.append(rx)
        ymod.append(ry)
        rPos+=dr
        while rPos > rtot[rcount+1]:
            rPos = rtot[rcount+1]
            rcount+=1
            if rcount>rtot[-1]:
                break

    return xmod,ymod


#CONSTANTS
NPOINTS = 10
COLOR='red'
RESFACT=10
MAP='winter' # choose carefully, or color transitions will not appear smoooth
cm = plt.get_cmap(MAP)

################ These are old data sets, just to use for this example 
x = points['x'].values
y = points['y'].values
z = points['z'].values

x2 = points['x2'].values
y2 = points['y2'].values
z2 = points['z2'].values

fig = plt.figure()
#ax1 = fig.add_subplot(111,projection='3d') # regular resolution color map

ax = fig.add_subplot(111, projection='3d')
ax.plot(x, y, z, c='red',marker='v', linewidth=1.0, markersize=2)
ax.plot(x2, y2, z2, c='blue', marker='o', linewidth=1.0, markersize=2)


ax.set_prop_cycle(color=[cm(1.*i/(NPOINTS-1)) for i in range(NPOINTS-1)])
for i in range(NPOINTS-1):
    #ax1.plot(x[i:i+2],y[i:i+2])
    ax.plot(x[i:i+2],y[i:i+2])


########################The part I want to merge in
#for i in range(1, 5):
    #if i == 1: i = '' #x is your first value not x1
    #ax.plot(points[f"x{i}"], points[f"y{i}"], points[f"z{i}"], c='red', marker='o', linewidth=1.0, markersize=2)

#########################
    
fig.savefig('colorgradienttest.png')
plt.show()

[Link to Image] I want to make the blue and red lines have a color gradient like the example 3rd line (markers are not important)

Script 2 - to which I want to apply the gradient (the one with the .csv)

from mpl_toolkits.mplot3d import Axes3D
import sys
import matplotlib.pyplot as plt
import pandas
import numpy as np

points = pandas.read_csv('D:Documents\PYTHON_FILES/test3d.csv')

fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')


#OPTION 1 - not sure why this isn't working for me so Im not using it yet
#for idx in range(29):
  # suffix = '' if idx == 0 else str(idx + 1) # ranges start at 0
  # x = points[f"x{suffix}"].values 
  # y = points[f"y{suffix}"].values
  # z = points[f"z{suffix}"].values
#ax.plot(x, y, z, c='red', marker='o', linewidth=1.0, markersize=2)
   
#OPTION 2 - current approach <<<<<<<<<<<<<<<< want to apply gradient to this segment
for i in range(1, 5):
    if i == 1: i = '' #x is your first value not x1
    ax.plot(points[f"x{i}"], points[f"y{i}"], points[f"z{i}"], c='red', marker='o', linewidth=1.0, markersize=2)


plt.show()

Trenton McKinney
  • 56,955
  • 33
  • 144
  • 158
nymkoi
  • 3
  • 2

0 Answers0