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
被丢弃了,因为它不会匹配y
或z
的索引长度。它们在 .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()
编辑:图表现在已修复,但我在绘制图例时遇到了问题。它仅显示其中 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
被丢弃了,因为它不会匹配y
或z
的索引长度。它们在.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()