Ayrı Pandas DataFrame'lerini alt çizimler olarak nasıl çizebilirim?


129

Aynı değer ölçeğini paylaşan, ancak farklı sütunlara ve indekslere sahip birkaç Pandas DataFrame'im var. Çağırırken df.plot(), ayrı arsa görüntüleri alıyorum. Gerçekten istediğim şey, hepsinin alt konularla aynı arsada olması, ancak ne yazık ki bir yardımın nasıl ve ne kadar çok takdir edileceğine dair bir çözüm bulamıyorum.

Yanıtlar:


252

Alt grafikleri matplotlib ile manuel olarak oluşturabilir ve ardından veri çerçevelerini axanahtar kelimeyi kullanarak belirli bir alt grafik üzerinde çizebilirsiniz . Örneğin 4 alt alan (2x2) için:

import matplotlib.pyplot as plt

fig, axes = plt.subplots(nrows=2, ncols=2)

df1.plot(ax=axes[0,0])
df2.plot(ax=axes[0,1])
...

Burada axes, farklı alt plan eksenlerini tutan bir dizi var ve bunlara sadece indeksleyerek erişebilirsiniz axes.
Paylaşılan x eksenini istiyorsanız, o zaman sağlayabilir sharex=Trueiçin plt.subplots.


33
Can sıkıcı bir şekilde, .subplots()oluşturduğunuz alt noktalar dizisinin boyutlarına bağlı olarak farklı koordinat sistemleri döndürdüğünü unutmayın . Dolayısıyla, diyelim ki, nrows=2, ncols=1eksenleri axes[0]ve olarak indekslemeniz gereken alt grafikleri döndürürseniz axes[1]. Bkz stackoverflow.com/a/21967899/1569221
canary_in_the_data_mine

3
Teşekkür @canary_in_the_data_mine, gerçekten sinir bozucu olduğunu ... yorumunuz Ben başlamıştı neden beni çözemedim biraz zaman :) kurtardıIndexError: too many indices for array
snd

9
@canary_in_the_data_mine Bu sadece varsayılan argümanlar .subplot()kullanılırsa can sıkıcıdır . Her durumda satır ve sütunlarda her zaman an döndürmek squeeze=Falseiçin zorlamak .subplot()için ayarlayın ndarray.
Martin

73

E.gs'i görebilirsiniz. içinde dokümantasyon gösteren joris cevap. Ayrıca dokümantasyondan, pandalar işlevini de ayarlayabilirsiniz subplots=Trueve layout=(,)içinde plot:

df.plot(subplots=True, layout=(1,2))

Ayrıca fig.add_subplot(), 221, 222, 223, 224, vb. Gibi alt grafik ızgara parametrelerini buradaki yazıda açıklandığı gibi alan seçeneğini de kullanabilirsiniz . Alt grafikler de dahil olmak üzere pandaların veri çerçevesindeki güzel arsa örnekleri bu ipython not defterinde görülebilir .


2
joris'in cevabı genel matplotlib kullanımı için harika olsa da, hızlı veri görselleştirme için pandaları kullanmak isteyen herkes için mükemmeldir. Ayrıca soruya biraz daha iyi uyuyor.
Küçük Bobby Tablolar

Unutmayın subplotsve layoutkwargs SADECE tek dataframe için birden araziler oluşturur. Bu, OP'nin birden fazla veri çerçevesini tek bir arsa içine yerleştirme sorusuyla ilgilidir, ancak bir çözüm değildir.
Austin

1
Bu, saf Pandalar için daha iyi bir cevaptır. Bu, matplotlib'i doğrudan içe aktarmayı gerektirmez (normalde zaten yapmanız gerekir) ve rastgele şekiller için döngü gerektirmez ( layout=(df.shape[1], 1)örneğin kullanılabilir).
Anatoly Makarevich

20

Bir arayarak tanıdık Matplotlib stilini kullanabilirsiniz figureve subplotfakat sadece kullanarak mevcut eksenini belirtmeniz gerekir plt.gca(). Bir örnek:

plt.figure(1)
plt.subplot(2,2,1)
df.A.plot() #no need to specify for first axis
plt.subplot(2,2,2)
df.B.plot(ax=plt.gca())
plt.subplot(2,2,3)
df.C.plot(ax=plt.gca())

vb...


7

Tüm veri çerçevelerinin bir listesini yapmak için basit bir hile ile matplotlib kullanarak birden çok pandas veri çerçevesinin birden çok alt grafiğini çizebilirsiniz. Daha sonra alt grafikleri çizmek için for döngüsünü kullanın.

Çalışma kodu:

import matplotlib.pyplot as plt
import pandas as pd
import numpy as np
# dataframe sample data
df1 = pd.DataFrame(np.random.rand(10,2)*100, columns=['A', 'B'])
df2 = pd.DataFrame(np.random.rand(10,2)*100, columns=['A', 'B'])
df3 = pd.DataFrame(np.random.rand(10,2)*100, columns=['A', 'B'])
df4 = pd.DataFrame(np.random.rand(10,2)*100, columns=['A', 'B'])
df5 = pd.DataFrame(np.random.rand(10,2)*100, columns=['A', 'B'])
df6 = pd.DataFrame(np.random.rand(10,2)*100, columns=['A', 'B'])
#define number of rows and columns for subplots
nrow=3
ncol=2
# make a list of all dataframes 
df_list = [df1 ,df2, df3, df4, df5, df6]
fig, axes = plt.subplots(nrow, ncol)
# plot counter
count=0
for r in range(nrow):
    for c in range(ncol):
        df_list[count].plot(ax=axes[r,c])
        count=+1

görüntü açıklamasını buraya girin

Bu kodu kullanarak, herhangi bir konfigürasyonda alt grafikleri çizebilirsiniz. Yalnızca satır nrowsayısını ve sütun sayısını tanımlamanız gerekir ncol. Ayrıca, df_listçizmek istediğiniz veri çerçevelerinin bir listesini yapmanız gerekir .


2
son satırdaki yazım count =+1count +=1
hatasına

4

Bunu kullanabilirsiniz:

fig = plt.figure()
ax = fig.add_subplot(221)
plt.plot(x,y)

ax = fig.add_subplot(222)
plt.plot(x,z)
...

plt.show()

3

Pandaları hiç kullanmanıza gerek olmayabilir. İşte kedi frekanslarının bir matplotlib grafiği:

görüntü açıklamasını buraya girin

x = np.linspace(0, 2*np.pi, 400)
y = np.sin(x**2)

f, axes = plt.subplots(2, 1)
for c, i in enumerate(axes):
  axes[c].plot(x, y)
  axes[c].set_title('cats')
plt.tight_layout()

1

Yukarıdaki @joris yanıtına dayanarak, alt grafiğe zaten bir referans oluşturduysanız, referansı da kullanabilirsiniz. Örneğin,

ax1 = plt.subplot2grid((50,100), (0, 0), colspan=20, rowspan=10)
...

df.plot.barh(ax=ax1, stacked=True)

0

Uzun (düzenli) veriler içeren bir veri çerçevesi sözlüğünden birden çok grafik nasıl oluşturulur

  • Varsayımlar

    • Düzenli verilerin birden çok veri çerçevesinden oluşan bir sözlüğü var
      • Dosyalardan okunarak oluşturuldu
      • Tek bir veri çerçevesinin birden çok veri çerçevesine ayrılmasıyla oluşturulur
    • Kategoriler catörtüşüyor olabilir, ancak tüm veri çerçeveleri tüm değerleri içermeyebilir.cat
    • hue='cat'
  • Veri çerçeveleri yinelendiğinden, renklerin her grafik için aynı şekilde eşleneceğinin garantisi yoktur.

    • 'cat'Tüm veri çerçeveleri için benzersiz değerlerden özel bir renk haritasının oluşturulması gerekir
    • Renkler aynı olacağından, her arsada bir efsane yerine, arsaların yan tarafına bir efsane yerleştirin.

İthalat ve sentetik veriler

import pandas as pd
import numpy as np  # used for random data
import random  # used for random data
import matplotlib.pyplot as plt
from matplotlib.patches import Patch  # for custom legend
import seaborn as sns
import math import ceil  # determine correct number of subplot


# synthetic data
df_dict = dict()
for i in range(1, 7):
    np.random.seed(i)
    random.seed(i)
    data_length = 100
    data = {'cat': [random.choice(['A', 'B', 'C']) for _ in range(data_length)],
            'x': np.random.rand(data_length),
            'y': np.random.rand(data_length)}
    df_dict[i] = pd.DataFrame(data)


# display(df_dict[1].head())

  cat         x         y
0   A  0.417022  0.326645
1   C  0.720324  0.527058
2   A  0.000114  0.885942
3   B  0.302333  0.357270
4   A  0.146756  0.908535

Renk eşlemeleri ve çizim oluşturun

# create color mapping based on all unique values of cat
unique_cat = {cat for v in df_dict.values() for cat in v.cat.unique()}  # get unique cats
colors = sns.color_palette('husl', n_colors=len(unique_cat))  # get a number of colors
cmap = dict(zip(unique_cat, colors))  # zip values to colors

# iterate through dictionary and plot
col_nums = 3  # how many plots per row
row_nums = math.ceil(len(df_dict) / col_nums)  # how many rows of plots
plt.figure(figsize=(10, 5))  # change the figure size as needed
for i, (k, v) in enumerate(df_dict.items(), 1):
    plt.subplot(row_nums, col_nums, i)  # create subplots
    p = sns.scatterplot(data=v, x='x', y='y', hue='cat', palette=cmap)
    p.legend_.remove()  # remove the individual plot legends
    plt.title(f'DataFrame: {k}')

plt.tight_layout()
# create legend from cmap
patches = [Patch(color=v, label=k) for k, v in cmap.items()]
# place legend outside of plot; change the right bbox value to move the legend up or down
plt.legend(handles=patches, bbox_to_anchor=(1.06, 1.2), loc='center left', borderaxespad=0)
plt.show()

görüntü açıklamasını buraya girin

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.