python - 在 Altair 中的绘图上重叠垂直线

标签 python pandas plot visualization altair

我有一个数据框 df看起来像这样:

+---+------------+-----------+--------+
|   |    date    | violation | pounds |
+---+------------+-----------+--------+
| 0 | 2010-05-13 | N         | NaN    |
| 1 | 2015-04-22 | Y         | NaN    |
| 2 | 2009-08-12 | Y         | NaN    |
| 3 | 2006-06-01 | NaN       | 3732.0 |
| 4 | 2006-08-01 | NaN       | 1340.0 |
| 5 | 2006-10-01 | NaN       | 1310.0 |
+---+------------+-----------+--------+

我想绘制 pounds纵轴上的变量,横坐标由时间序列给出 date , 并将垂直线覆盖到图上 violation不是楠。基本上,我想要下面的图表,除了 df.violation 的非 NaN 值处的竖线:

example chart

我尝试叠加两个 Chart()对象在彼此之上 this notebook但它似乎没有用。我希望能够做这样的事情:
points = Chart(df).mark_point().encode(y='pounds', x='date')
rules = Chart(df[df['violation']=='Y']).mark_rule().encode(x='date')
points + rules

我检查了单独的图表 pointsrules两者看起来都不错。然而points + rules命令导致以下错误:
ValueError                                Traceback (most recent call last)
~/anaconda3/lib/python3.5/site-packages/IPython/core/formatters.py in __call__(self, obj)
    907             method = _safe_get_formatter_method(obj, self.print_method)
    908             if method is not None:
--> 909                 method()
    910                 return True
    911 

~/anaconda3/lib/python3.5/site-packages/altair/api.py in _ipython_display_(self)
    186         from IPython.display import display
    187         from vega import VegaLite
--> 188         display(VegaLite(self.to_dict()))
    189 
    190     def display(self):

~/anaconda3/lib/python3.5/site-packages/vega/base.py in __init__(self, spec, data)
     21         """Initialize the visualization object."""
     22         spec = utils.nested_update(copy.deepcopy(self.DEFAULTS), spec)
---> 23         self.spec = self._prepare_spec(spec, data)
     24 
     25     def _prepare_spec(self, spec, data):

~/anaconda3/lib/python3.5/site-packages/vega/vegalite.py in _prepare_spec(self, spec, data)
     22 
     23     def _prepare_spec(self, spec, data):
---> 24         return prepare_spec(spec, data)
     25 
     26 

~/anaconda3/lib/python3.5/site-packages/vega/utils.py in prepare_spec(spec, data)
     91         # Data is either passed in spec or error
     92         if 'data' not in spec:
---> 93             raise ValueError('No data provided')
     94     else:
     95         # As a last resort try to pass the data to a DataFrame and use it

ValueError: No data provided

我知道 Altair 仍处于起步阶段,因此缺乏文档,但有人知道如何轻松做到这一点吗?这是在 ggplot2 中微不足道的任务之一.

最佳答案

尝试

points = Chart(df).mark_point().encode(y='pounds', x='date')
rules = Chart(df).mark_rule().encode(x='date').transform_filter(datum.violation == 'Y')
points + rules

看看this link这进一步解释了它

关于python - 在 Altair 中的绘图上重叠垂直线,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40381251/

相关文章:

python - 将索引重命名为数据帧中的连续字符串?

r - 在 R 中绘制条件推理树时更改标签大小

python - Python Poetry 的依赖版本语法

python - wxPython 找不到错误

python - 读取 csv 文件时的混合类型。原因、修复和后果

python - 从离散化数值的 pandas get_dummies 创建开放边界指标

python - 库未加载 : libssl. 1.0.0.dylib 原因:找不到图像

python - 使用 RDFLib 将包含空白节点的三元组添加到 Stardog

python - 使用 plotly 和 cufflinks 获得分组箱线图的任何简单方法?

excel - 在 Excel 的一个文本框中引用多个单元格?