#python #matplotlib #subplot
#python #matplotlib #подзаговор
Вопрос:
В настоящее время на моей диаграмме отображается только основная большая диаграмма слева.
Однако теперь я хочу добавить два меньших графика в правую часть моего основного графика; с каждым отдельным набором данных.
Я борюсь с подзаголовками, чтобы понять, как это сделать. На моей фотографии ниже показан желаемый результат.
filenamesK = glob("C:/Users/Ke*.csv")
filenamesZ = glob("C:/Users/Ze*.csv")
K_Z_Averages = {'K':[], 'Z':[]}
# We will create a function for plotting, instead of nesting lots of if statements within a long for-loop.
def plot_data(filename, fig_ax, color):
df = pd.read_csv(f, sep=',',skiprows=24) # Read in the csv.
df.columns=['sample','Time','ms','Temp1'] # Set the column names
df=df.astype(str) # Set the data type as a string.
df["Temp1"] = df["Temp1"].str.replace(' ', '').str.replace(' ', '').astype(float) # Convert to float
# Take the average of the data from the Temp1 column, starting from sample 60 until sample 150.
avg_Temp1 = df.iloc[60-1:150 1]["Temp1"].mean()
# Append this average to a K_Z_Averages, containing a column for average from each K file and the average from each Z file.
# Glob returns the whole path, so you need to replace 0 for 10.
K_Z_Averages[os.path.basename(filename)[0]].append(avg_Temp1)
fig_ax.plot(df[["Temp1"]], color=color)
fig, ax = plt.subplots(figsize=(20, 15))
for f in filenamesK:
plot_data(f, ax, 'blue')
for f in filenamesZ:
plot_data(f, ax, 'red')
plt.show()
Комментарии:
1. Этот урок было бы полезно проверить
Ответ №1:
ответ @max прекрасен, но кое-что, что вы также можете сделать matplotlib> = 3.3, это
import matplotlib.pyplot as plt
fig = plt.figure(constrained_layout=True)
axs = fig.subplot_mosaic([['Left', 'TopRight'],['Left', 'BottomRight']],
gridspec_kw={'width_ratios':[2, 1]})
axs['Left'].set_title('Plot on Left')
axs['TopRight'].set_title('Plot Top Right')
axs['BottomRight'].set_title('Plot Bottom Right')
Обратите внимание, что повторяющееся имя 'Left'
используется дважды, чтобы указать, что этот подзаголовок занимает два слота в макете. Также обратите внимание на использование width_ratios
.
Комментарии:
1. Спасибо! Один вопрос — и как бы я тогда увеличил, скажем, «График слева» в 2 раза, если бы захотел?
2. Больше, чем что? Использовать width_ratio?
Ответ №2:
Это сложный вопрос. По сути, вы можете поместить сетку на фигуру ( add_gridspec()
), а затем открыть подзаголовки ( add_subplot()
) в разных элементах сетки и поверх них.
import matplotlib.pyplot as plt
# open figure
fig = plt.figure()
# add grid specifications
gs = fig.add_gridspec(2, 3)
# open axes/subplots
axs = []
axs.append( fig.add_subplot(gs[:,0:2]) ) # large subplot (2 rows, 2 columns)
axs.append( fig.add_subplot(gs[0,2]) ) # small subplot (1st row, 3rd column)
axs.append( fig.add_subplot(gs[1,2]) ) # small subplot (2nd row, 3rd column)