Python(双胞胎图)古怪的图表

Python (twinx plot) Wacky graph

编辑:图表现在已修复,但我在绘制图例时遇到了问题。它仅显示其中 1 个地块的图例。如下图所示

我正在尝试使用 twinx 绘制双轴图,但我遇到了一些困难,如下图所示。

欢迎任何意见!如果您需要任何其他信息,我很乐意为您提供。

与绘制 z 轴之前的原始数据相比。

我不确定为什么我的图表最初是这样的,在绘制我的次要 y 轴(粉红色线)之前,可以完美地看到收盘值图表,但现在它似乎被切断了。

这可能是由于我提供的以下数据。

Link 到 testing1.csv:https://filebin.net/ou93iqiinss02l0g

我目前拥有的代码:

# read csv into variable
sg_df_merged = pd.read_csv("testing1.csv", parse_dates=[0], index_col=0)

# define figure
fig = plt.figure()

fig, ax5 = plt.subplots()
ax6 = ax5.twinx()

x = sg_df_merged.index
y = sg_df_merged["Adj Close"]
z = sg_df_merged["Singapore"]

curve1 = ax5.plot(x, y, label="Singapore", color = "c")
curve2 = ax6.plot(x, z, label = "Face Mask Compliance", color = "m")
curves = [curve1, curve2]

# labels for my axis
ax5.set_xlabel("Year")
ax5.set_ylabel("Adjusted Closing Value ($)")
ax6.set_ylabel("% compliance to wearing face mask")
ax5.grid #not sure what this line does actually

# set x-axis values to 45 degree angle
for label in ax5.xaxis.get_ticklabels():
    label.set_rotation(45)
ax5.grid(True, color = "k", linestyle = "-", linewidth = 0.3)

plt.gca().legend(loc='center left', bbox_to_anchor=(1.1, 0.5), title = "Country Index")
plt.show(); 

最初,我认为这是由于我的 excel 有完整的空白行,但后来我删除了可以找到的行

此外,我尝试过插值,但不知何故它不起作用。非常欢迎对此提出任何建议

  • 仅删除了全部 NaN 的行。还有很多行 NaN.
  • 为了matplotlib在两个数据点之间绘制连接线,这些点必须是连续的。
  • 绘图 API 没有连接 NaN 值之间的数据
  • 这可以通过将 pandas.Series 转换为 DataFrame 并使用 .dropna.
  • 来解决
  • 看到x被丢弃了,因为它不会匹配yz的索引长度。它们在 .dropna.
  • 之后更短
  • y 现在是一个单独的数据框,其中使用了 .dropna
  • z也是一个单独的dataframe,这里使用了.dropna
  • 地块的 x-axis 是各自的指数。
# read csv into variable
sg_df_merged = pd.read_csv("test.csv", parse_dates=[0], index_col=0)

# define figure
fig, ax5 = plt.subplots(figsize=(8, 6))
ax6 = ax5.twinx()

# select specific columns to plot and drop additional NaN
y = pd.DataFrame(sg_df_merged["Adj Close"]).dropna()
z = pd.DataFrame(sg_df_merged["Singapore"]).dropna()

# add plots with markers
curve1 = ax5.plot(y.index, 'Adj Close', data=y, label="Singapore", color = "c", marker='o')
curve2 = ax6.plot(z.index, 'Singapore', data=z, label = "Face Mask Compliance", color = "m", marker='o')

# labels for my axis
ax5.set_xlabel("Year")
ax5.set_ylabel("Adjusted Closing Value ($)")
ax6.set_ylabel("% compliance to wearing face mask")
    
# rotate xticks
ax5.xaxis.set_tick_params(rotation=45)

# add a grid to ax5
ax5.grid(True, color = "k", linestyle = "-", linewidth = 0.3)

# create a legend for both axes
curves = curve1 + curve2
labels = [l.get_label() for l in curves]
ax5.legend(curves, labels, loc='center left', bbox_to_anchor=(1.1, 0.5), title = "Country Index")

plt.show()