Chr*_*ris 7 python matplotlib bar-chart
我见过在轴上放置断轴斜线标记的 matplotlib 示例,例如这个。
我的问题是,如何将其放置在损坏的栏杆处?是否可以通过编程方式完成逐月更新时间序列图?
下面是我想要使用 Excel 完成的示例。请注意巴黎六月酒吧和马德里五月酒吧中的波形符。波形符隐藏了它所覆盖的栏的一部分。

我还提供了更简单的示例数据以及迄今为止我所能做的事情。
XX = pd.Series([200,400,100,1400],index=['x1','x2','x3','x4'])
fig, (ax1,ax2) = plt.subplots(2,1,sharex=True,
figsize=(5,6))
ax1.spines['bottom'].set_visible(False)
ax1.tick_params(axis='x',which='both',bottom=False)
ax2.spines['top'].set_visible(False)
ax2.set_ylim(0,500)
ax1.set_ylim(1200,1500)
ax1.set_yticks(np.arange(1000,1501,100))
XX.plot(ax=ax1,kind='bar')
XX.plot(ax=ax2,kind='bar')
for tick in ax2.get_xticklabels():
tick.set_rotation(0)
d = .015
kwargs = dict(transform=ax1.transAxes, color='k', clip_on=False)
ax1.plot((-d, +d), (-d, +d), **kwargs)
ax1.plot((1 - d, 1 + d), (-d, +d), **kwargs)
kwargs.update(transform=ax2.transAxes)
ax2.plot((-d, +d), (1 - d, 1 + d), **kwargs)
ax2.plot((1 - d, 1 + d), (1 - d, 1 + d), **kwargs)
plt.show()
Run Code Online (Sandbox Code Playgroud)
只是为了说明原理,您可以在柱形超过下轴上限的每个位置以及柱形超出上轴下限的位置放置相同类型的线。
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
XX = pd.Series([200,400,100,1400],index=['x1','x2','x3','x4'])
fig, (ax1,ax2) = plt.subplots(2,1,sharex=True,
figsize=(5,6))
ax1.spines['bottom'].set_visible(False)
ax1.tick_params(axis='x',which='both',bottom=False)
ax2.spines['top'].set_visible(False)
bs = 500
ts = 1000
ax2.set_ylim(0,bs)
ax1.set_ylim(ts,1500)
ax1.set_yticks(np.arange(1000,1501,100))
bars1 = ax1.bar(XX.index, XX.values)
bars2 = ax2.bar(XX.index, XX.values)
for tick in ax2.get_xticklabels():
tick.set_rotation(0)
d = .015
kwargs = dict(transform=ax1.transAxes, color='k', clip_on=False)
ax1.plot((-d, +d), (-d, +d), **kwargs)
ax1.plot((1 - d, 1 + d), (-d, +d), **kwargs)
kwargs.update(transform=ax2.transAxes)
ax2.plot((-d, +d), (1 - d, 1 + d), **kwargs)
ax2.plot((1 - d, 1 + d), (1 - d, 1 + d), **kwargs)
for b1, b2 in zip(bars1, bars2):
posx = b2.get_x() + b2.get_width()/2.
if b2.get_height() > bs:
ax2.plot((posx-3*d, posx+3*d), (1 - d, 1 + d), color='k', clip_on=False,
transform=ax2.get_xaxis_transform())
if b1.get_height() > ts:
ax1.plot((posx-3*d, posx+3*d), (- d, + d), color='k', clip_on=False,
transform=ax1.get_xaxis_transform())
plt.show()
Run Code Online (Sandbox Code Playgroud)
它看起来不太好,但当然可以采用更好的形状。
| 归档时间: |
|
| 查看次数: |
15393 次 |
| 最近记录: |