2017-10-22 10 views
0

私は1992年から2017年の時系列データセットを持っています。私は、データドット全体の色を設定することができますが、私が欲しいのは、特定の年の範囲に望ましい色を設定することです。例えば; 1995年から2005年の "Red"など、1992〜1995年の "Blue"からどうやってそれを行うことができますか?特定の年の値の範囲に異なる色を指定するにはどうすればいいですか? (Python)

データセットには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) 

enter image description here

+1

SOへようこそ。サンプルデータを提供し、あなたがしたことを教えてください:[最小、完全、および検証可能な例](https://stackoverflow.com/help/mcve) – skrubber

+0

コードと出力画像が追加されました。 –

答えて

0

私が動作するように、この機能のために私自身のランダムなデータを作ったが、これは動作するはずです、あなたが重複しない日付範囲を持っていると仮定。あなたの日付は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") 

これが生成します。私はポイントの散布図のためのカラーマップを使用して簡単な解決策であり得ることを想像

enter image description here

0

。散布図の色は、年が10進形式で与えられていると仮定して、年によって単純に定義されます。 A 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() 

enter image description here

関連する問題