Jupyter Notebook - Matplotlib Çizgi Grafiği

Herkese merhabalar,

Ben Jupyter Notebook kullanarak verileri ekrana çizdirmek istiyorum. Yatay eksende tarihleri, dikey eksende de verileri yazdırmak istiyorum.

Ancak ekrana verileri getirdiğim zaman yatay eksende tarihler değil tarihlerin sıra numarası görünüyor. Bunu nasıl çözebilirim acaba?

y.values dediğinizde altta yatan NumPy array’ine (veya kopyasına) geçiş yapıyorsunuz, y_predicted da büyük ihtimalle bir NumPy array’i; bunlar pandas series’i/dataframe’i gibi satır ve sütünları için “label” bilmezler, düz sayılardan (bu örnekte) oluşurlar. plt.plot'a bunları pasladığınızda x-eksenine 0…N-1 otomatik olarak koyulur.

plt.plot'un ilk parametresine y'nin indeksini paslayabilirsiniz:

plt.plot(y.index, y.to_numpy().round(3)...)
plt.plot(y.index, y_predicted...)

(.values yerine .to_numpy'ın tercih edilmesi öneriliyor tutarlı tasarım adına).


Bu arada pandas’ın da plotting kabiliyeti var (https://pandas.pydata.org/docs/user_guide/visualization.html) belki tamamen pandas domain’inde kalmak da isteyebilirsiniz; ama y_predicted'ı da elle çevirmeniz gerekir (gibi duruyor: paylaştığınız kodun o kısmı pek belli değil maalesef; ayriyeten resim yerine tekst tercih edilirse yanıtlamaya çalışanların işi de kolaylaşmakta bu arada):

# oop tarzı plot'lama zemini
fig, ax = plt.subplots(figsize=(14, 7))

# pandas üzerinden çizim (yine matplotlib çağrılır); `ax`'ı pasladık 
y.round(3).mul(5980).plot(label="gerçek", ls="-", c="g", ax=ax)

# önce pandas serisine çeviririz sonra tekrar üzerinden plot; `ax` aynı `ax`
y_pred = pd.Series(y_predicted, index=y.index)
y_pred.mul(5980).plot(label="tahmin", ls="--", c="r", ax=ax)

# ayarlamalar
ax.legend(loc="upper left")
ax.grid(which="both")

Çok yeniyim o yüzden paylaşım yaparken yanlış ya da eksik bilgi verdiysem özür dilerim. Şöyle benim çalışmamın tam halini o zaman paylaşıyorum.

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from seaborn import heatmap
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error, r2_score
from sklearn.preprocessing import MinMaxScaler
from sklearn.neural_network import MLPRegressor
import matplotlib.style as mplstyle

Burada kütüphaneleri yükledim. Daha sonra ben verileri çekip işledim.

plt.style.use('seaborn-white')
csv_file_url = 'http://www.facadium.com.tr/cvd19/nisansonunakadarolanveriler.csv'
dataset = pd.read_csv(csv_file_url, sep = ',', index_col=0)
pd.set_option("display.max.rows", None)
dataset.head(2000)

Ardından grafiğe döktüm tüm veri setindeki verileri.

for i, col in enumerate(dataset.columns.tolist()):
    plt.figure(figsize=(10, 6))
    x_axis = dataset.index.values
    y_axis = dataset[col].values
    plt.plot(x_axis, y_axis, label=col,marker='o')
    plt.title(col)
    plt.xlabel("Günler")
    plt.ylabel("Veriler")
    counter = 0
    for a, b in zip(x_axis, y_axis):
        counter +=1
        if counter % 60 == 0:
            plt.annotate(str(b), xy=(a,b))

Grafiğe döktükten sonra verileri listeledim.

dataset_shifted = dataset.iloc[0:,:]
dataset_shifted.head(2000)
dataset_shifted.describe()
scaler = MinMaxScaler()
dataset_scaled = scaler.fit_transform(dataset_shifted.values)
dataset_scaled = pd.DataFrame(scaler.fit_transform(dataset_shifted),columns=dataset_shifted.columns)
dataset_scaled.index = dataset_shifted.index
dataset_scaled.head(2000)

Ardından korelasyon ile ısı haritasını oluşturdum.

korelasyon = dataset_scaled.corr()
korelasyon
heatmap(korelasyon, xticklabels=dataset_shifted.columns, yticklabels=dataset_shifted.columns)

Daha sonra verilerden tahminler çıkarmaya çalışıyorum. Burada 1,2,4 numaralı verilerden 4 numralı veriyi tahmin etmesini istiyorum.

x = dataset_scaled.iloc[:,[1,2,4]]
y = dataset_scaled.iloc[:,[4]]
x
y
mlp = MLPRegressor(hidden_layer_sizes=(75,), max_iter=10000, learning_rate_init=0.05, random_state=41)
mlp.fit(x.values, y.values)
y_predicted = mlp.predict(x.values)
y_predicted
y.values.round(3)

Buradan aldığım sonuçlarda r2 leri ve array’leri buluyorum.

mean_squared_error(y.values, y_predicted)
r2_score(y.values, y_predicted)
mlp.coefs_[0].round(3)
mlp.intercepts_

Daha sonra grafiklere dökmeye çalışıyorum aldığım veriyi. Ancak verilerimi ekrana dökerken yatay eksende tarihleri düşey eksende verileri görmek istiyorum.

ax= y.plot(linestyle='-')
plt.xlabel("Günler",
         fontdict={
             'family' : 'Times New Roman',
             'color' : 'black',
             'size' : 14
         })

plt.ylabel("Veriler",
         fontdict={
             'family' : 'Times New Roman',
             'color' : 'black',
             'size' : 14
         })
plt.title("Tek Katmanlı Ağır Hasta Sayısı Grafiği",
         fontdict={
             'family' : 'Times New Roman',
             'color' : 'black',
             'size' : 20
         })
plt.legend()
plt.grid()

Burada aldığım grafikte yatay eksende veriler tarih olarak geliyor ancak düşey eksende veriler 0-1 arasında ölçekleniyor. Onun yerine şunu denemek istedim.

plt.plot(y.values.round(3)*5980, label = 'Gerçek Değer',linestyle="-", color='green')
plt.plot(y_predicted*5980, label = 'Tahmini Değer',linestyle='dashed', color='red')

plt.legend(loc="upper left")

plt.style.use(['seaborn-white'])
plt.grid()

Ama bu sefer de düşey eksende verileri alıyorum ama yatay eksende tarih yerine tarihlerin sıra numarasını görüyorum.

Ben iki veriyi ( gerçek değerler, tahmini değerleri) aynı ekranda çizdirmek ve düşey eksende verileri yatay eksende ise tarihleri görüntülemek istiyorum ancak yapamıyorum. Burada tıkandım. Umarım derdimi anlatabilmişimdir.

Estağfurullah ne özrü, elinize sağlık teşekkürler paylaşım için. Plotting kısmından evvel

sizce de burada bir “sızma” yok mu tahmin yaparken? Yani 4’ün tahmininde 4’ün kendisinin de kullanılması çok büyük başarıya sebep olmaz mı? Nitekim ilk gönderinizdeki grafik de birbirine çok yakın değerleri işaret ediyor.


Örneğin bir LinearRegression modeli kullansak ve 3 feature’a da verdiği katsayılara baksak hedeflenen değeri içeren feature’ınkinin 1’e çok yakın, diğer ikisininkinin de 0’a çok yakın olmasını bekleriz:

import numpy as np
from sklearn.datasets import make_regression
from sklearn.linear_model import LinearRegression

# 3 feature'dan oluşan bir veri seti; 3.sü elle `y` eklenerek oluşturuluyor
X, y = make_regression(n_features=2, random_state=12)
X = np.column_stack((X, y))

# düz linear regression
model = LinearRegression()
model.fit(X, y)

# 3 feature'a gelen katsayılar
print(model.coef_)

Ekrana yazdırılan:

[0.06062698 0.01483932 0.99608887]

Görüldüğü gibi y’ın bulunduğu son feature’a 0.996’lık bir katsayı atandı.

Açıkçası şu an sadece bir deneme yapıyorum. Tekrar üzerinden geçeceğim. Bu yaptığım denemeden kalmış değiştireceğim. Ancak bunları ekrana çizdiremiyorum. Yani gerçek değerleri ve tahmini değerleri aynı grafikte gösteremiyorum. Yaptığım çalışmalarda ya yatay eksende tarihler varken dikey eksende verileri gösteremiyorum. Dikey eksende verileri göstersem yatay eksende tarihi gösteremiyorum. Bu aşamayı gecemedim bir türlü. Ne yapmam gerekiyor acaba?

Şunu denemiş miydiniz?

veya bunu

Yukarıdaki bir yanıttan alıntı https://forum.yazbel.com/t/jupyter-notebook-matplotlib-cizgi-grafigi/13525/2

Bu arada 5980 ile çarpmak yerine scaler'ın inverse_transform'unu kullanabilirDiniz ama hem X’i hem de y’yi aynı scaler ile scale ettiğiniz için kullanılamamakta. Ayrı olurlarsa:

# iki ayrı scaler
scaler_X = MinMaxScaler()
scaler_y = MinMaxScaler()

# iki ayrı scaling
scaled_X = scaler_y.fit_transform(X)
scaled_y = scaler_y.fit_transform(y)

# training
mlp.fit(scaled_X, scaled_y)

# prediction; inverse scaling'i otomatik yapıyoruz
y_predicted_scaled = mlp.predict(scaled_X)
y_predicted = scaler_y.inverse_transform(y_predicted_scaled)

# sonra yukarıdaki gibi plotting
# oop tarzı plot'lama zemini
fig, ax = plt.subplots(figsize=(14, 7))

# pandas üzerinden çizim (yine matplotlib çağrılır); `ax`'ı pasladık 
y.round(3).mul(5980).plot(label="gerçek", ls="-", c="g", ax=ax)

# önce pandas serisine çeviririz sonra tekrar üzerinden plot; `ax` aynı `ax`
y_predicted = pd.Series(y_predicted, index=y.index)
y_predicted.mul(5980).plot(label="tahmin", ls="--", c="r", ax=ax)

# ayarlamalar
ax.legend(loc="upper left")
ax.grid(which="both")

Merhabalar,

Rahatsızlığım nedeniyle bir süre uzak kaldım. Bu yüzden cevap yazamadım özür dilerim. Verdiğiniz bilgiler çok işime yaradı. Çok teşekkür ediyorum desteğiniz için.

1 Beğeni