Это производит:

я есть набор данных временного ряда, с 1992 по 2017 год. Я могу установить цвет для всех точек данных, но мне нужно установить желаемый цвет для определенного года. Например; с 1992 по 1995 год "Blue", с 1995 по 2005 "Red" и т. д. Как мы можем это сделать?

Набор данных имеет 2 столбца; год и значение.

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)

введите описание изображения здесь

 Ömer22 окт. 2017 г., 02:24
Код и выходная картинка добавлены.
 skrubber22 окт. 2017 г., 02:18
Добро пожаловать в ТАК. Предоставьте образцы данных и расскажите нам, что вы сделали:Минимальный, полный и проверяемый пример

Ответы на вопрос(2)

что использование цветовой карты для точечного графика точек может быть простым решением. Цвет разброса тогда будет просто определяться годом, если предположить, что год указан в десятичном формате.BoundaryNorm будет определять диапазоны для значений, и цветовая карта может быть легко создана из списка цветов.

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()

но если у вас есть непересекающиеся диапазоны дат, это должно сработать. Также казалось, что ваши даты не имеютpd.datetime тип. Это должно работать дляpd.datetime типы, но ваши значения поиска в словаре будет что-то вроде("1992-01-01","2000-01-01") и так далее.

# 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")

Это производит:

Ваш ответ на вопрос