簡體   English   中英

如何繪制seaborn嶺圖

[英]How to plot a seaborn ridge plot

使用seaborn 0.11,我想繪制一個seaborn ridge plot

我想在一個圖中繪制磁譜數據。 所以y軸只計算圖的數量,x軸使用在此處輸入圖片說明 數據。 這是我所期待的一個例子。

這些是不同角度的光譜數據。 有沒有辦法在python中繪制這樣的東西? 提前致謝。

import matplotlib.pyplot as plt

data = np.loadtxt("0_deg.txt", skiprows=0, dtype=np.float128)
fig, ax = plt.subplots(figsize=(8, 6))
ax.plot(data, markersize=1, label="0° ")

數據看起來像這樣

數據

269.09019   0.10781
269.09208   0.10908
269.09397   0.11928
269.09587   0.11800
269.09776   0.11418
269.09966   0.11545
269.10155   0.11928
269.10344   0.11673
269.10534   0.10781
269.10723   0.10526
269.10913   0.11418
269.11102   0.11418
269.11292   0.11291
269.11481   0.11928
269.11670   0.11928
269.11860   0.12055
269.12049   0.11928
269.12239   0.11928
269.12428   0.11673
269.12618   0.11545
269.12807   0.11545
269.12996   0.11036
269.13186   0.10908
269.13375   0.10144
269.13565   0.10908
269.13754   0.10654
269.13943   0.10399
269.14133   0.10526
269.14322   0.11418
269.14512   0.10908
269.14701   0.10272
269.14891   0.09889
269.15080   0.10526
269.15269   0.09889
269.15459   0.09635
269.15648   0.09889
269.15838   0.10017
269.16027   0.09507
269.16217   0.08998
269.16406   0.09507
269.16595   0.08870
269.16785   0.09252
269.16974   0.09762
269.17164   0.09889
269.17353   0.09507
269.17542   0.10017
269.17732   0.10399
269.17921   0.10144
269.18111   0.09762
269.18300   0.10144
269.18490   0.10144
269.18679   0.09635
269.18868   0.10017
269.19058   0.10399
269.19247   0.10017
269.19437   0.10017
269.19626   0.09889
269.19816   0.10017
269.20005   0.09507
269.20194   0.09635
269.20384   0.09380
269.20573   0.09252
269.20763   0.08998

在此處輸入圖片說明

嶺圖

  • 使用pathlib.glob查找目錄中的所有文件
  • 將文件加載到pandas.DataFrames list
    • 文件名用下划線分割,並使用索引-1的值作為每組數據的'label'列值。 該值為0deg10deg等。
      • 每個文件的標簽必須是唯一的,因為繪圖行由標簽決定。
    • 給定f = WindowsPath('data/CuSo4_10mV_300mS_Amod9.44V_0deg')作為pathlib對象
      • f.suffix'.44V_0deg'
      • f.suffix.split('_')[-1]'0deg'
    • 添加了'label'列,以便可以為每條繪圖線識別正確的'intensity'值。
  • 使用pandas.concat組合數據pandas.concat列表。
  • 山脊圖的 DataFrame 必須采用長(整潔)格式
import seaborn as sns
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns

sns.set_theme(style="white", rc={"axes.facecolor": (0, 0, 0, 0)})

# find the local files
p = Path('c:/somepathtofiles')  # p = Path.cwd()  # for data in the current working directory
files = list(p.glob('*.44V*'))

# load all the data, but create a dataframe in the correct form for a RidgePlot
dfl = list()
for f in files:
    v = pd.read_csv(f, sep='\\s+', header=None, usecols=[1])
    v.columns = ['intensity']
    v['label'] = f.suffix.split('_')[-1]
    dfl.append(v)

# combine the list of dataframes into a single dataframe    
df = pd.concat(dfl)

# plot
# Initialize the FacetGrid object
pal = sns.cubehelix_palette(len(df.label.unique()), rot=-.25, light=.7)
g = sns.FacetGrid(df, row="label", hue="label", aspect=15, height=.5, palette=pal)

# Draw the densities in a few steps
g.map(sns.kdeplot, "intensity", bw_adjust=.5, clip_on=False, fill=True, alpha=1, linewidth=1.5)
g.map(sns.kdeplot, "intensity", clip_on=False, color="w", lw=2, bw_adjust=.5)
g.map(plt.axhline, y=0, lw=2, clip_on=False)

# Define and use a simple function to label the plot in axes coordinates
def label(x, color, label):
    ax = plt.gca()
    ax.text(0, .2, label, fontweight="bold", color=color, ha="left", va="center", transform=ax.transAxes)

g.map(label, "intensity")

# Set the subplots to overlap
g.fig.subplots_adjust(hspace=-.25)

# Remove axes details that don't play well with overlap
g.set_titles("")
g.set(yticks=[])
g.despine(bottom=True, left=True)

# uncomment the following line if there's a tight layout warning
# g.fig.tight_layout()

在此處輸入圖片說明

更新前

import pandas as pd
import matplotlib.pyplot as plt
from pathlib import Path

###########################################################
# Use if loading the data from the local computer

# create the path to the files
p = Path('c:/somepathtofiles')

# if loading the data from the local computer
# get a generator of all the files
files = p.glob('*.44V*')

# load the files into a dict of pandas.DataFrames
dfd = {f'{file.suffix.split("_")[-1]}': pd.read_csv(file, sep='\\s+', header=None) for file in files}

###########################################################
# Use if loading data from GitHub

# don't use both lines for files.
files = [f'https://raw.githubusercontent.com/mahesh27dx/NPR/master/CuSo4_10mV_300mS_Amod9.44V_{v}deg' for v in range(0, 190, 10)]

# load the files into a dict of pandas.DataFrames
dfd = {f'{file.split("_")[-1]}': pd.read_csv(file, sep='\\s+', header=None) for file in files}

###########################################################

# iterate through the dict
plt.figure(figsize=(10, 8))  # set up plot figure
for k, v in dfd.items():
    dfd[k].columns = ['mag_field', 'intensity']

    sns.lineplot(x='mag_field', y='intensity', data=v, label=k)
    
plt.legend(bbox_to_anchor=(1.05, 1), loc='upper left')
plt.xlabel('Magnetic Field')
plt.ylabel('Field Intensity')
plt.show()

在此處輸入圖片說明

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM