1

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

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

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

在此处输入图像描述

与绘制 z 轴之前的原始图像相比。

在此处输入图像描述

我不确定为什么我的图表在绘制辅助 y 轴(粉红色线)之前就像最初那样,可以完美地看到收盘值图表,但现在它似乎被剪掉了。

这可能是由于我的数据如下所示。

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 有整个空白行,但我已经删除了可以在此处找到的行

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

4

1 回答 1

3
  • NaN仅删除了所有位置的行。仍然有很多行NaN
  • 为了matplotlib在两个数据点之间绘制连接线,这些点必须是连续的。
  • 绘图 API 未连接值之间的NaN数据
  • 这可以通过将 转换pandas.Series为 aDataFrame并使用 来解决.dropna
  • 看到x已删除,因为它与yor的索引长度不匹配z。之后它们更短.dropna
  • y现在是一个单独的数据框,在哪里.dropna使用。
  • z也是一个单独的数据框,.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()

在此处输入图像描述

于 2020-09-16T16:28:21.120 回答