Wie man ein Seekammplot plottet
Sep 17 2020
Mit Seaborn 0.11 möchte ich ein Seaborn Ridge Plot zeichnen
Ich möchte die Magnetspektrumsdaten in einem einzigen Diagramm darstellen. Die y-Achse zählt also nur die Anzahl der Diagramme und die x-Achse verwendet
Dies sind die Spektrumsdaten für verschiedene Winkel. Gibt es Möglichkeiten, so etwas in Python zu zeichnen? Danke im Voraus.
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° ")
Daten sehen so aus
Daten
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
Antworten
3 TrentonMcKinney Sep 17 2020 at 04:21
Ridge Plot
- Verwenden Sie pathlibmit
.globallen Dateien in dem Verzeichnis finden - Laden Sie die Dateien in eine
listvonpandas.DataFrames- Der Dateiname wird in Unterstriche aufgeteilt und verwendet den Wert am Index
-1als'label'Spaltenwert für jeden Datensatz. Dieser Wert ist0deg,10degusw.- Die Beschriftung für jede Datei muss eindeutig sein, da die Plotzeile durch die Beschriftung bestimmt wird.
- Gegeben
f = WindowsPath('data/CuSo4_10mV_300mS_Amod9.44V_0deg')alspathlibObjektf.suffixist'.44V_0deg'f.suffix.split('_')[-1]ist'0deg'
- Eine
'label'Spalte wird hinzugefügt, damit die richtigen'intensity'Werte für jede Plotlinie identifiziert werden können.
- Der Dateiname wird in Unterstriche aufgeteilt und verwendet den Wert am Index
- Verwenden Sie
pandas.concatdiese Option, um die Liste der Datenrahmen zu kombinieren. - Der DataFrame für ein Ridge-Plot muss ein langes (ordentliches) Format haben
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()
Vor dem Update
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()