【发布时间】:2017-12-11 01:55:12
【问题描述】:
代码:
import matplotlib.pyplot as plt
import pandas as pd
from numpy import arange
%matplotlib inline
avg_discount = pd.read_json('{"Date":{"0":1498694400000,"1":1498780800000,"2":1498867200000,"3":1498953600000,"4":1499040000000},"Discount":{"0":0.2136567047,"1":0.2186422586,"2":0.2171303955,"3":0.2273395644,"4":0.2285249182}}')
auth_counts = pd.read_json('{"index":{"0":"False","1":"True"},"authorized":{"0":155,"1":22}}')
violation_counts = pd.read_json('{"index":{"0":"False","1":"True"},"violations":{"0":55,"1":7}}')
fig = plt.figure()
ax1 = fig.add_subplot(1,1,1, label='1')
ax2 = ax1.twinx() #tried .twiny() but didn't work as desired
ax3 = fig.add_subplot(1,1,1, label='2', frame_on=False)
bar_positions = arange(2) + 0.75
ax1.bar(bar_positions, auth_counts['authorized'],0.5, color='#b0c4de')
ax1.xaxis.tick_top()
tick_positions = range(1,3)
ax1.set_xticks(tick_positions)
ax1.set_xticklabels(['Unauthorized','Authorized'])
ax2.bar(bar_positions, [55,7], 0.5)
ax2.set_ylim([1,160])
ax2.tick_params(axis='both', top='off', right='off', labelright='off')
ax3.plot(avg_discount['Date'], avg_discount['Discount'], color='r', marker='o')
ax3.tick_params(axis='both', left='off', top='off', right='off',labelleft='off')
ax3.set_xticklabels([val.day for val in avg_discount['Date']], rotation=90)
plt.show()
结果:
数据解释: - ax1 代表两个不同的组及其计数。 ax2 代表执行了某个动作的那两个组。 ax3 添加了一条统计趋势线,用于定义这些组的成员所采取的行动。
问题: - x 轴和相关数据点未与线图 ax3 对齐。另外,我想整齐地显示日期,但决定显示日期。任何关于如何更好地表示这些数据的建议将不胜感激。 - 虽然我设法让两个条形图重叠,但它们不再整齐地间隔开。我只能假设这是因为 matplotlib 试图找到一个满足所有 3 个图表的 xlimit,但是当我编辑所有 3 到 10 个图表的 xlimit 时,ax3 说限制超出了范围。
预期输出: - 我正在寻找的输出应该看起来有点类似于第一个条形图的输出。第 2 个条形图覆盖在第 1 个条形图上,线条绘制在图中。
【问题讨论】:
-
"neatly
" 不是正确的问题描述。看了两遍问题,还是不知道是什么问题。你能准确描述一下情节有什么问题以及它应该是什么样子吗? -
@ImportanceOfBeingErnest 我已经编辑了我的问题。根据我的理解,将 x 刻度设置为 0.75 和 1.5,宽度为 0.5 将导致第一个条形图从 x 轴上的 0.75 开始并以 1.25 结束,第二个从 1.5 开始并以 2 结束。我希望保持两边的边距。
-
尝试运行您的代码会出错。你能提供一个minimal reproducible example 的问题吗?
-
@ImportanceOfBeingErnest 完成。
标签: python pandas matplotlib