在 for 循环中只绘制了带有标记的最后一条曲线 - 如何绘制所有标记
only last curve with marker is plotted in for loop - how to plot all markers
我创建了一个标记列表,其中每个标记用于显示该曲线的最大值。 (4 条曲线 -> 4 个标记)
不知怎么的,我无法让所有标记出现在情节中。似乎只绘制了 for 循环中的第一个标记。
import pandas as pd
from matplotlib import pyplot as plt
import numpy as np
df0 = pd.DataFrame(np.random.randint(0,1000,size=(18, 4)), columns=list('ABCD'))
#df0 = pd.read_excel("est.xlsx")
df0.plot()
mylist = list(df0)
# df=df.astype(float)
mrkr = ['o', '.', 'v', 'x']
mrkr_df = pd.DataFrame(mrkr)
idx_mx_vals = []
for i in range(len(mylist)):
if df0[mylist[i]][0] > 0:
idx_mx_vals.append(df0[mylist[i]].idxmax())
else:
idx_mx_vals.append(df0[mylist[i]].idxmin())
mx_vals = []
for i in range(len(mylist)):
if df0[mylist[i]][0] > 0:
mx_vals.append(df0[mylist[i]].max())
else:
mx_vals.append(df0[mylist[i]].min())
d = {}
for i in range(len(mylist)):
d[df0.columns[i]] = [idx_mx_vals[i], mx_vals[i], mrkr[i]]
df = pd.DataFrame(d)
print(df)
for col in range(len(mrkr_df.columns)):
plt.plot(df.iloc[0, col], df.iloc[1, col], marker=mrkr_df.iloc[2, col],
markersize=20)
替换:
for col in range(len(mrkr_df.columns)):
plt.plot(df.iloc[0, col], df.iloc[1, col], marker=mrkr_df.iloc[2, col],
markersize=20)
与:
for col, m in enumerate(mrkr):
plt.plot(df.iloc[0, col], df.iloc[1, col], marker=m, markersize=20)
您可以大大简化您的代码,直接在绝对值上使用 idxmax
作为矢量调用。您也不需要创建中间数据帧来保存 idxmax/max(我仍然展示了一种更简单的计算方法)。
这是绘制曲线和最大极值的简单版本。我还添加了相同的颜色来匹配线条。
import pandas as pd
from matplotlib import pyplot as plt
import numpy as np
np.random.seed(0)
df0 = pd.DataFrame(np.random.randint(0,1000,size=(18, 4)), columns=list('ABCD'))
#df0 = pd.read_excel("est.xlsx")
ax = df0.plot()
mrkr = ['o', '.', 'v', 'x']
mrkr_df = pd.DataFrame(mrkr)
idx_mx_vals = df0.abs().idxmax().to_list()
mx_vals = df0.to_numpy()[idx_mx_vals, np.arange(len(idx_mx_vals))].tolist()
# not needed
#df = pd.DataFrame(dict(zip(df, zip(idx_mx_vals, mx_vals, mrkr))))
for x, y, m, line in zip(idx_mx_vals, mx_vals, mrkr, ax.lines):
ax.plot(x, y, marker=m, c=line.get_color(), markersize=20)
输出:
我创建了一个标记列表,其中每个标记用于显示该曲线的最大值。 (4 条曲线 -> 4 个标记)
不知怎么的,我无法让所有标记出现在情节中。似乎只绘制了 for 循环中的第一个标记。
import pandas as pd
from matplotlib import pyplot as plt
import numpy as np
df0 = pd.DataFrame(np.random.randint(0,1000,size=(18, 4)), columns=list('ABCD'))
#df0 = pd.read_excel("est.xlsx")
df0.plot()
mylist = list(df0)
# df=df.astype(float)
mrkr = ['o', '.', 'v', 'x']
mrkr_df = pd.DataFrame(mrkr)
idx_mx_vals = []
for i in range(len(mylist)):
if df0[mylist[i]][0] > 0:
idx_mx_vals.append(df0[mylist[i]].idxmax())
else:
idx_mx_vals.append(df0[mylist[i]].idxmin())
mx_vals = []
for i in range(len(mylist)):
if df0[mylist[i]][0] > 0:
mx_vals.append(df0[mylist[i]].max())
else:
mx_vals.append(df0[mylist[i]].min())
d = {}
for i in range(len(mylist)):
d[df0.columns[i]] = [idx_mx_vals[i], mx_vals[i], mrkr[i]]
df = pd.DataFrame(d)
print(df)
for col in range(len(mrkr_df.columns)):
plt.plot(df.iloc[0, col], df.iloc[1, col], marker=mrkr_df.iloc[2, col],
markersize=20)
替换:
for col in range(len(mrkr_df.columns)):
plt.plot(df.iloc[0, col], df.iloc[1, col], marker=mrkr_df.iloc[2, col],
markersize=20)
与:
for col, m in enumerate(mrkr):
plt.plot(df.iloc[0, col], df.iloc[1, col], marker=m, markersize=20)
您可以大大简化您的代码,直接在绝对值上使用 idxmax
作为矢量调用。您也不需要创建中间数据帧来保存 idxmax/max(我仍然展示了一种更简单的计算方法)。
这是绘制曲线和最大极值的简单版本。我还添加了相同的颜色来匹配线条。
import pandas as pd
from matplotlib import pyplot as plt
import numpy as np
np.random.seed(0)
df0 = pd.DataFrame(np.random.randint(0,1000,size=(18, 4)), columns=list('ABCD'))
#df0 = pd.read_excel("est.xlsx")
ax = df0.plot()
mrkr = ['o', '.', 'v', 'x']
mrkr_df = pd.DataFrame(mrkr)
idx_mx_vals = df0.abs().idxmax().to_list()
mx_vals = df0.to_numpy()[idx_mx_vals, np.arange(len(idx_mx_vals))].tolist()
# not needed
#df = pd.DataFrame(dict(zip(df, zip(idx_mx_vals, mx_vals, mrkr))))
for x, y, m, line in zip(idx_mx_vals, mx_vals, mrkr, ax.lines):
ax.plot(x, y, marker=m, c=line.get_color(), markersize=20)
输出: