【问题标题】:Bar and Line Subplot with shared y-axis共享 y 轴的条形图和线形子图
【发布时间】:2021-05-12 01:14:08
【问题描述】:

我正在尝试在水平子图中输出折线图和条形图并共享 y 轴,但我只能输出 1,但不能同时输出两者。

import pandas as pd 
import yfinance as yf  

df = yf.download('SPY',period='1y')[['Adj Close','Volume']] 

df['Bin'] = pd.cut(df['Adj Close'],bins=[200,225,250,275,300,325,350,375,400]) 
df_a = df.groupby('Bin')['Volume'].size().reset_index()
df_a['left'] =  df_a['Bin'].apply(lambda x: x.left)
df_a.set_index('left',inplace=True) 


fig, axes = plt.subplots(ncols=2, sharey=True)
df['Adj Close'].plot(ax=axes[0],kind='line') ## line 1 
df_a['Volume'].plot(ax=axes[1],kind='barh') ## line 2
  1. 如何使两个图(共享 y 轴)同时出现? (第一张是我只有第 1 行的时候,第二张是我有第 1 行和第 2 行的时候)
  2. 如何使折线图的 x 轴更长

我尝试删除输出两个图表的“sharey=True”,但 y 轴未对齐。

【问题讨论】:

    标签: pandas matplotlib


    【解决方案1】:

    Matploblib 允许分别使用 Axes.twinxAxes.twiny 方法为 X 轴和 Y 轴创建双轴。

    使用以下代码,两个图都绘制在同一个图上。

    fig, ax = plt.subplots()
    
    volume_ax = ax.twiny()
    adj_close_ax = ax.twinx()
    
    df['Adj Close'].plot(ax=adj_close_ax,kind='line') ## line 1 
    df_a['Volume'].plot(ax=volume_ax,kind='barh', color='lightblue') ## line 2
    

    【讨论】:

    • 抱歉,我可能不太清楚。我正在尝试输出 2 个图作为子图而不是一个组合图。我面临的问题是,如果我插入“Sharey=True”,则线图不会出现,但如果我删除“Sharey=True”,则 y 轴未对齐
    【解决方案2】:

    df.plot(kind='barh') 实际上是根据范围索引绘制条形图,即range(len(df)) 并重新标记轴刻度。您可以改用plt.barh

    fig, axes = plt.subplots(ncols=2, sharey=True)
    df['Adj Close'].plot(ax=axes[0],kind='line') ## line 1 
    
    # same height with bin width
    axes[1].barh(df_a.index, df_a['Volume'], height=25) ## line 2
    

    输出:

    【讨论】:

      猜你喜欢
      • 2019-09-03
      • 2021-11-22
      • 2016-03-24
      • 1970-01-01
      • 1970-01-01
      • 2018-02-08
      • 1970-01-01
      • 1970-01-01
      • 2019-02-18
      相关资源
      最近更新 更多