¿Cómo especificar un color diferente para un rango de valores de año específico en una sola figura? (Pitón)

Tengo un conjunto de datos de series de tiempo, de 1992-2017. Puedo configurar un color para todos los puntos de datos, pero lo que quiero es configurar el color deseado para un rango de año específico. Por ejemplo; de 1992 a 1995 “Azul”, de 1995 a 2005 “Rojo”, etc. ¿Cómo podemos hacer eso?

El conjunto de datos tiene 2 columnas; año y valor.

import numpy as np import pandas as pd from scipy import stats from sklearn import linear_model from matplotlib import pyplot as plt import pylab import matplotlib.patches as mpatches import matplotlib.pyplot as plt import seaborn as sns from sklearn.linear_model import LinearRegression Atlantic = pd.read_csv('C:\\AtlanticEnd.csv', error_bad_lines=False) X = Atlantic['year'] y = Atlantic['Poseidon'] plt.figure(figsize=(20,10)) plt.ylabel('Change in mean sea level [mm]', fontsize=20) plt.xlabel('Years', fontsize=20) plt.title('Atlantic Ocean - Mean Sea Level', fontsize=20) colors = ["blue", "red", "green", "purple"] texts = ["Poseidon", "Jason1", "Jason2", "Jason3"] patches = [ plt.plot([],[], marker="o", ms=10, ls="", mec=None, color=colors[i], label="{:s}".format(texts[i]) )[0] for i in range(len(texts)) ] plt.legend(handles=patches, loc='upper left', ncol=1, facecolor="grey", numpoints=1 ) plt.plot(X, y, 'ro', color='red') slope, intercept, r_value, p_value, std_err = stats.linregress(X, y) plt.plot(X, X*slope+intercept, 'b') plt.axis([1992, 2018, -25, 80]) plt.grid(True) plt.show() def trendline(Atlantic, order=1): coeffs = np.polyfit(Atlantic.index.values, list(Atlantic), order) slope = coeffs[-2] return float(slope) slope = trendline(y) print(slope) 

introduzca la descripción de la imagen aquí

Podría imaginar que el uso de un mapa de colores para un diagtwig de dispersión de los puntos puede ser una solución fácil. El color de la dispersión sería entonces simplemente definido por el año, asumiendo que el año se da en formato decimal. Un BoundaryNorm definiría los rangos para los valores y un mapa de colores se puede crear fácilmente desde una lista de colores.

 import numpy as np import pandas as pd import matplotlib.pyplot as plt import matplotlib.colors y = np.random.rand(300)*26+1992 d = (3.075*(y-1992)-17)+np.random.normal(0,5,300) df = pd.DataFrame({"year" : y, "data" : d}) bounds = [1992,1995,2005,2015,2018] colors = ["darkorchid", "crimson", "limegreen", "gold"] cmap = matplotlib.colors.ListedColormap(colors) norm = matplotlib.colors.BoundaryNorm(bounds, len(colors)) fig, ax = plt.subplots() sc = ax.scatter(df.year, df.data, c=df.year.values, cmap=cmap, norm=norm) fig.colorbar(sc, spacing="proportional") fit = np.polyfit(df.year.values, df.data.values, deg=1) ax.plot(df.year, np.poly1d(fit)(df.year.values), color="k") plt.show() 

introduzca la descripción de la imagen aquí

Hice mis propios datos aleatorios para que esta función funcione, pero suponiendo que tenga intervalos de fechas que no se superponen, esto debería funcionar. También parece que sus fechas no son del tipo pd.datetime . Esto debería funcionar para los tipos pd.datetime pero los valores de búsqueda en el diccionario serán similares a ("1992-01-01","2000-01-01") y así sucesivamente.

 # Create data data = np.random.rand(260,1) dates = np.array(list(range(1992,2018))*10) df = pd.DataFrame({"y":data[:,0],"date":dates}) df = df.sort(columns="date") # Dictionary lookup lookup_dict = {(1992,2000):"r", (2001,2006):"b",(2007,2018):"k"} # Slice data and plot fig, ax = plt.subplots() for lrange in lookup_dict: temp = df[(df.date>=lrange[0]) & (df.date<=lrange[1])] ax.plot(temp.date,temp.y,color=lookup_dict[lrange], marker="o",ls="none") 

Esto produce:

introduzca la descripción de la imagen aquí