带折线图的条形图 - 使用非数字索引
Posted
技术标签:
【中文标题】带折线图的条形图 - 使用非数字索引【英文标题】:Bar Chart with Line Chart - Using non numeric index 【发布时间】:2018-03-20 12:05:18 【问题描述】:我想在同一张图上显示数据框的条形图和表示总和的折线图。 我可以对索引为数字或文本的框架执行此操作。但它不适用于日期时间索引。 这是我使用的代码:
import datetime as dt
np.random.seed(1234)
data = np.random.randn(10, 2)
date = dt.datetime.today()
index_nums = range(10)
index_text = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'k']
index_date = pd.date_range(date + dt.timedelta(days=-9), date)
a_nums = pd.DataFrame(columns=['a', 'b'], index=index_nums, data=data)
a_text = pd.DataFrame(columns=['a', 'b'], index=index_text, data=data)
a_date = pd.DataFrame(columns=['a', 'b'], index=index_date, data=data)
fig, ax = plt.subplots(3, 1)
ax = ax.ravel()
for i, a in enumerate([a_nums, a_text, a_date]):
a.plot.bar(stacked=True, ax=ax[i])
(a.sum(axis=1)).plot(c='k', ax=ax[i])
如您所见,最后一张图表仅作为带有条形图图例的线条出现。而且日期不见了。
如果我用
替换最后一行ax[i].plot(a.sum(axis=1), c='k')
然后:
index_nums的图表是一样的 带有 index_text 的图表出现错误 index_date 图表显示条形图,但不显示折线图。fgo 我正在使用 pytho 3.6.2 pandas 0.20.3 和 matplotlib 2.0.2
【问题讨论】:
省略ax.plot(a.sum(axis=1), c='k')
行并添加必要的导入问题中的代码工作正常,适用于数字、文本和日期索引。因此,您的要求并不清楚。
到底是什么问题?这两个图看起来都和我很相似,而且都没有使用任何日期时间索引。
所以现在看来唯一的问题是日期时间图,其他两个按预期工作。你可以编辑问题,不要让周围有太多分散注意力的东西吗?
@ImportanceOfBeingErnest 谢谢我已经更新了问题。
我更新了答案。
【参考方案1】:
将条形图和折线图绘制到相同的轴上通常可能会出现问题,因为条形图将条形图放置在整数位置 (0,1,2,...N-1
),而折线图使用数字数据来确定纵坐标。
在问题的情况下,使用range(10)
作为条形图和线形图的索引可以正常工作,因为这些正是条形图无论如何都会使用的数字。使用文本也可以正常工作,因为这需要用数字替换才能显示它,当然前 N 个整数用于此目的。
日期时间索引的条形图也使用前 N 个整数,而折线图将绘制在日期上。因此,根据哪个先出现,您只会看到线图或条形图(您实际上可以通过相应地更改 xlimits 来看到另一个)。
一个简单的解决方案是先绘制条形图,然后将索引重置为折线图数据框上的数字。
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np; np.random.seed(1234)
import datetime as dt
data = np.random.randn(10, 2)
date = dt.datetime.today()
index_date = pd.date_range(date + dt.timedelta(days=-9), date)
df = pd.DataFrame(columns=['a', 'b'], index=index_date, data=data)
fig, ax = plt.subplots(1, 1)
df.plot.bar(stacked=True, ax=ax)
df.sum(axis=1).reset_index().plot(ax=ax)
fig.autofmt_xdate()
plt.show()
或者,您可以像往常一样绘制线图并使用 matplotlib 条形图,它接受数字位置。看到这个答案:Python making combined bar and line plot with secondary y-axis
【讨论】:
非常感谢。有时做不同类型的情节有点违反直觉。我很惊讶第二种方法ax[i].plot(a.sum(axis=1), c='k')
实际上引发了文本索引错误。
matplotlib plot
需要参数 x 和 y,ax.plot(range(len(df)), df.sum(axis=1))
或单个数组作为 y 参数,ax.plot(df.sum(axis=1).values)
。以上是关于带折线图的条形图 - 使用非数字索引的主要内容,如果未能解决你的问题,请参考以下文章
如何在具有不同 Y 轴的同一个 seaborn 图中很好地制作条形图和线图?