当与 x 轴上的日期时间变量一起使用时,线图不显示
Line plot doesn't show when used with a datetime variable on the x-axis
我正在尝试绘制一个带有两个折线图的条形图。条形图显示正常,但我似乎无法在条形图上方绘制线条。这是代码:
fig, ax = plt.subplots(figsize=(18,9))
sns.set_style("darkgrid")
g=sns.barplot(date_new, df["Net xG (xG - Opponent's xG)"].astype("float"), palette="coolwarm_r", hue=df["Net xG (xG - Opponent's xG)"].replace({"-":0}).astype("float"), dodge=False, data=df)
plt.plot(date_new, -df["Opponent's xG"].astype("float"), color="gold", marker="o")
plt.plot(date_new, df["xG (Expected goals)"].astype("float"), color="indianred", marker="o")
g.set_xticklabels(stuff[::-1], rotation=90)
g.get_legend().remove()
g.set(xlim=([-0.8, 46]))
plt.show()
date_new
用于 x 轴的变量采用 datetime64[ns] 格式。我注意到的一件奇怪的事情是,如果我将 date_new
重新格式化为 date_new.astype("str")
之类的字符串,线条图会显示,但顺序会颠倒。
我试图通过将 x 轴变量更改为 date_new[::-1]
来“重新反转”日期排序的顺序,但这似乎并没有改变线图的顺序。
这是 x(日期)和 y(xG)轴变量在数据帧上的外观的屏幕截图:
您正在尝试将条形图与两个折线图结合起来。您似乎在匹配 x 轴变量时遇到了问题。正如@Henry Ecker 上面所说,条形图上的 x 轴标签是装饰性的,并不代表实际的日期时间轴。因此,条形图的 x 轴值只是数字 0 到 46。
要解决您的问题,只需将线图 x 值设为从 0 到 46 的列表。
我模拟了您的数据并在下面的示例中演示了解决方案。
import matplotlib.pyplot as plt
import seaborn as sns
import numpy as np
import pandas as pd
# create data
# there are 46 rows each representing a game against some other club
# colums include: date of game, opposing club, club goals, opposing club goals
# goal range is 0-5
df = pd.DataFrame({
'date':pd.date_range(start='1/2021', end='7/1/2021', periods=46),
'club':['Team: ' + str(n) for n in range(1,47)],
'goals': np.random.randint(0, 5, 46),
'opposing_goals':np.random.randint(0, 5, 46)
})
df['net_goals'] = df.goals - df.opposing_goals
fig, ax = plt.subplots(figsize=(18,9))
sns.set_style("darkgrid")
g=sns.barplot(
x=df.date, y=df.net_goals,
palette="coolwarm_r", hue=df.net_goals, dodge=False, data=df
)
plt.plot(np.arange(0,46), -df.opposing_goals, color="gold", marker="o")
plt.plot(np.arange(0,46), df.goals, color="indianred", marker="o")
g.set_xticklabels(df.club, rotation=45)
g.get_legend().remove()
g.set(xlim=([-0.8, 46]))
我正在尝试绘制一个带有两个折线图的条形图。条形图显示正常,但我似乎无法在条形图上方绘制线条。这是代码:
fig, ax = plt.subplots(figsize=(18,9))
sns.set_style("darkgrid")
g=sns.barplot(date_new, df["Net xG (xG - Opponent's xG)"].astype("float"), palette="coolwarm_r", hue=df["Net xG (xG - Opponent's xG)"].replace({"-":0}).astype("float"), dodge=False, data=df)
plt.plot(date_new, -df["Opponent's xG"].astype("float"), color="gold", marker="o")
plt.plot(date_new, df["xG (Expected goals)"].astype("float"), color="indianred", marker="o")
g.set_xticklabels(stuff[::-1], rotation=90)
g.get_legend().remove()
g.set(xlim=([-0.8, 46]))
plt.show()
date_new
用于 x 轴的变量采用 datetime64[ns] 格式。我注意到的一件奇怪的事情是,如果我将 date_new
重新格式化为 date_new.astype("str")
之类的字符串,线条图会显示,但顺序会颠倒。
我试图通过将 x 轴变量更改为 date_new[::-1]
来“重新反转”日期排序的顺序,但这似乎并没有改变线图的顺序。
这是 x(日期)和 y(xG)轴变量在数据帧上的外观的屏幕截图:
您正在尝试将条形图与两个折线图结合起来。您似乎在匹配 x 轴变量时遇到了问题。正如@Henry Ecker 上面所说,条形图上的 x 轴标签是装饰性的,并不代表实际的日期时间轴。因此,条形图的 x 轴值只是数字 0 到 46。
要解决您的问题,只需将线图 x 值设为从 0 到 46 的列表。
我模拟了您的数据并在下面的示例中演示了解决方案。
import matplotlib.pyplot as plt
import seaborn as sns
import numpy as np
import pandas as pd
# create data
# there are 46 rows each representing a game against some other club
# colums include: date of game, opposing club, club goals, opposing club goals
# goal range is 0-5
df = pd.DataFrame({
'date':pd.date_range(start='1/2021', end='7/1/2021', periods=46),
'club':['Team: ' + str(n) for n in range(1,47)],
'goals': np.random.randint(0, 5, 46),
'opposing_goals':np.random.randint(0, 5, 46)
})
df['net_goals'] = df.goals - df.opposing_goals
fig, ax = plt.subplots(figsize=(18,9))
sns.set_style("darkgrid")
g=sns.barplot(
x=df.date, y=df.net_goals,
palette="coolwarm_r", hue=df.net_goals, dodge=False, data=df
)
plt.plot(np.arange(0,46), -df.opposing_goals, color="gold", marker="o")
plt.plot(np.arange(0,46), df.goals, color="indianred", marker="o")
g.set_xticklabels(df.club, rotation=45)
g.get_legend().remove()
g.set(xlim=([-0.8, 46]))