是否可以将工具提示添加到时间序列图表中?
在下面的简化代码示例中,当鼠标悬停在相关行上时,我希望看到单个列名称('a','b'或'c').
相反,一个"???" 显示并且所有三行都得到一个工具提示(而不仅仅是悬停在其上的一个)
根据文档( http://bokeh.pydata.org/en/latest/docs/user_guide/tools.html#hovertool),以"@"开头的字段名称将被解释为数据源上的列.
如何在工具提示中显示pandas数据框中的"列"?
或者,如果高级TimeSeries接口不支持此功能,那么使用较低级别接口执行相同操作的任何线索?(line?multi_line?)或将DataFrame转换为不同的格式(ColumnDataSource?)
对于奖励积分,如何格式化"$ x"以将日期显示为日期?
提前致谢
import pandas as pd
import numpy as np
from bokeh.charts import TimeSeries
from bokeh.models import HoverTool
from bokeh.plotting import show
toy_df = pd.DataFrame(data=np.random.rand(5,3), columns = ('a', 'b' ,'c'), index = pd.DatetimeIndex(start='01-01-2015',periods=5, freq='d'))
p = TimeSeries(toy_df, tools='hover')
hover = p.select(dict(type=HoverTool))
hover.tooltips = [
("Series", "@columns"),
("Date", "$x"),
("Value", "$y"),
]
show(p)
Run Code Online (Sandbox Code Playgroud) 这里接受的答案是什么(JFreechart(Java) - 如何绘制部分虚线和部分实线的线条?)帮助我开始在我的图表上更改我的seriesstroke线.单步执行我的代码并观察更改后,我发现我的seriesstroke实际上确实改为"dashedStroke"(当某个日期之后为"dashedAfter"),但是当渲染图表时整个系列行都是虚线.如何将一系列线条首先绘制为实线并在设定日期后绘制为虚线?
/* series line modifications */
final Number dashedAfter = timeNowDate.getTime();
XYLineAndShapeRenderer render = new XYLineAndShapeRenderer() {
Stroke regularStroke = new BasicStroke();
Stroke dashedStroke = new BasicStroke(
1.0f, BasicStroke.CAP_ROUND, BasicStroke.JOIN_ROUND,
1.0f, new float[] {10.0f, 6.0f}, 0.0f );
@Override
public Stroke getItemStroke(int row, int column) {
Number xVal = cd.getXValue(row, column);
if (xVal.doubleValue() > dashedAfter.doubleValue()) {
return dashedStroke;
} else {
return regularStroke;
}
}
};
render.setBaseShapesVisible(false);
render.setBaseShapesFilled(true);
render.setDrawSeriesLineAsPath(true);
plot.setRenderer(render);
Run Code Online (Sandbox Code Playgroud) 我们如何按小时或分钟的粒度聚合时间序列?如果我有一个如下所示的时间序列,那么我希望按小时聚合这些值。pandas 是否支持它,或者在 python 中是否有一种很好的方法来做到这一点?
timestamp, value
2012-04-30T22:25:31+00:00, 1
2012-04-30T22:25:43+00:00, 1
2012-04-30T22:29:04+00:00, 2
2012-04-30T22:35:09+00:00, 4
2012-04-30T22:39:28+00:00, 1
2012-04-30T22:47:54+00:00, 8
2012-04-30T22:50:49+00:00, 9
2012-04-30T22:51:57+00:00, 1
2012-04-30T22:54:50+00:00, 1
2012-04-30T22:57:22+00:00, 0
2012-04-30T22:58:38+00:00, 7
2012-04-30T23:05:21+00:00, 1
2012-04-30T23:08:56+00:00, 1
Run Code Online (Sandbox Code Playgroud)
我还尝试通过调用来确保我的数据框中有正确的数据类型:
print data_frame.dtypes
Run Code Online (Sandbox Code Playgroud)
我得到以下内容
ts datetime64[ns]
val int64
Run Code Online (Sandbox Code Playgroud)
当我在数据框上调用 group by 时
grouped = data_frame.groupby(lambda x: x.minute)
Run Code Online (Sandbox Code Playgroud)
我收到以下错误:
grouped = data_frame.groupby(lambda x: x.minute)
AttributeError: 'int' object has no attribute 'minute'
Run Code Online (Sandbox Code Playgroud) 如何从数据帧的两列绘制两条线图,并且另一列表示 x 轴,另外两列表示前两列的悬停值(工具提示)?
我想对模拟模型进行单元测试,为此,我运行一次模拟并将结果(时间序列)作为参考存储在 csv 文件中(请参阅此处的示例)。现在,当我更改模型时,我再次运行模拟,将新结果也存储为 csv 文件,然后比较结果。
结果通常不是 100% 相同,示例图如下所示:
参考结果以黑色绘制,新结果以绿色绘制。
两者的差异在第二个图中以蓝色绘制。
可以看出,在一个步骤中,差异可以变得任意高,而其他地方的差异几乎为零。
因此,我更愿意使用不同的算法进行比较,而不仅仅是将两者相减,但我只能以图形方式描述我的想法:绘制参考线两次时,首先使用具有高线宽的浅色,然后再次使用深色颜色和小线宽,那么它看起来就像在中心线周围有一个粉红色的管子。
请注意,在一个步骤中,管不仅在纵坐标方向上,而且在横坐标方向上。在进行比较时,我想知道绿线是否留在粉红色管内。
现在我的问题是:我不想使用图形比较两个时间序列,而是使用 python 脚本。一定已经有这样的东西了,但我找不到它,因为我缺少正确的词汇,我相信。有任何想法吗?在 numpy、scipy 或类似的东西中是否有类似的东西?还是我必须自己写比较?
附加问题:当脚本说这两个系列不够相似时,我想按上述方式绘制它(使用 matplotlib),但线宽必须以其他单位定义,而不是我通常用来定义线宽的单位.
我有一个以 15 分钟为间隔的几个月内 EUR/JPY 汇率的绘图图表,因此,没有从周五晚上到周日晚上的数据。
这是部分数据,注意周末索引(类型:DatetimeIndex)中的跳过:
使用上面的数据框绘制这些数据会导致缺失日期的差距:
import plotly.graph_objs as go
candlesticks = go.Candlestick(x=data.index, open=data['Open'], high=data['High'],
low=data['Low'], close=data['Close'])
fig = go.Figure(layout=cf_layout)
fig.add_trace(trace=candlesticks)
fig.show()
Run Code Online (Sandbox Code Playgroud)
输出:
如您所见,缺少日期的位置存在间隙。我在网上找到的一种解决方案是使用以下方法将索引更改为文本:
data.index = data.index.strftime("%d-%m-%Y %H:%M:%S")
Run Code Online (Sandbox Code Playgroud)
并再次绘制它,这确实有效,但它有自己的问题。x 轴标签看起来很糟糕:
我想生成一个图表,该图表绘制的图表类似于第二个图表中没有间隙的图表,但 x 轴的显示方式与第一个图表上的相同。或者至少以更简洁和响应式的格式显示,尽可能接近第一个图形。
预先感谢您的任何帮助!
我正在尝试在JFreeChart中生成一个包含重叠烛台图和时间序列图的单个图表.(有点像这样)
烛台趋势叠加http://www.prices-oil.org/wp-content/uploads/2009/04/oil1stapril.jpg
我已经尝试创建烛台图表,然后添加一个额外的XY系列和它的渲染器,但这会导致运行时错误
org.jfree.data.xy.XYSeriesCollection cannot be cast to org.jfree.data.xy.OHLCDataset
我的代码片段如下
private XYPlot plot;
private XYSeriesCollection dataTrend;
private XYItemRenderer renderer;
public OhlcChart(BarCollection bars)
{
JFreeChart jfreechart = ChartFactory.createCandlestickChart("FX Trader Prototype", "Time", "Value", getDataset(bars), true);
plot = (XYPlot)jfreechart.getPlot();
plot.setDomainPannable(true);
NumberAxis numberAxis = (NumberAxis)plot.getRangeAxis();
numberAxis.setAutoRangeIncludesZero(false);
numberAxis.setAutoRangeStickyZero(false);
numberAxis.setUpperMargin(0.0D);
numberAxis.setLowerMargin(0.0D);
DateAxis dateAxis = (DateAxis) plot.getDomainAxis();
SimpleDateFormat formatter = new SimpleDateFormat("dd MMM HH:mm.ss");
dateAxis.setDateFormatOverride(formatter);
this.renderer = plot.getRenderer();
Stroke myStroke = new BasicStroke((float) 1.0);
this.renderer = new XYLineAndShapeRenderer();
this.renderer.setSeriesPaint(0, Color.blue);
this.renderer.setSeriesStroke(0, myStroke);
}
public OhlcChart update(Timeseries<Double> ts) …
Run Code Online (Sandbox Code Playgroud) 我正在尝试使用R在Excel上制作的图表进行复制,这应该表示围绕时间序列预测的95%置信区间(CI).Excel图表如下所示:
所以,基本上,原始的历史时间序列,并从某个时间点预测它可能与其各自的CI.
他们在Excel上完成的方式效率有点低:
显然,生成预测和CI的计算速度更快,更容易推广和使用R,虽然我可以在R上完成任务然后只需复制Excel上的输出来绘制图表,在R中执行所有操作更好.
在问题的最后,我提供了dput()
@MLavoie建议的原始数据.
在这里我加载的包(不确定你在这里需要它们,但它们是我经常使用的):
require(zoo)
require(xts)
require(lattice)
require(latticeExtra)
Run Code Online (Sandbox Code Playgroud)
对于前100行,我的数据如下所示:
> head(data)
fifth_percentile Median nintyfifth_percentile
2017-06-18 1.146267 1.146267 1.146267
2017-06-19 1.134643 1.134643 1.134643
2017-06-20 1.125664 1.125664 1.125664
2017-06-21 1.129037 1.129037 1.129037
2017-06-22 1.147542 1.147542 1.147542
2017-06-23 1.159989 1.159989 1.159989
Run Code Online (Sandbox Code Playgroud)
然后在100个数据点之后,时间序列开始发散,最后它们看起来像这样:
> tail(data)
fifth_percentile Median nintyfifth_percentile
2017-12-30 0.9430930 1.125844 1.341603
2017-12-31 0.9435227 1.127391 1.354928
2018-01-01 0.9417235 1.124625 1.355527
2018-01-02 0.9470077 1.124088 1.361420
2018-01-03 0.9571596 1.127299 1.364005
2018-01-04 0.9515535 1.127978 1.369536
Run Code Online (Sandbox Code Playgroud)
解决方案由DaveTurek提供
感谢DaveTurek,我找到了答案.但是,唯一不同的是,对于我的xts数据帧,显然,我需要先将每列转换为数字(with …
分析自行车道的时间序列数据,我想知道每个高原、上升和下降的时间间隔。此处上传示例 csv 文件。
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from datetime import datetime
import matplotlib.dates as mdates
df = pd.read_csv(r'C:\Data\Sample.csv', parse_dates=['dateTime'])
feature_used='Cycle_Alt'
print("Eliminating null values..")
df=df[df[feature_used].notnull()]
plt.figure(figsize=(8,6))
x=df['dateTime']
y=df['Cycle_Alt']
plt.plot(x,y,c='b',linestyle=':',label="Altitude")
plt.xticks(rotation='vertical')
plt.gcf().autofmt_xdate()
plt.legend(loc='best', bbox_to_anchor=(1, 0.5))
Run Code Online (Sandbox Code Playgroud)
可以做些什么来对时间序列数据进行分类以检测每个高原、上升和下降,并假设一个变量可能比样本中呈现的变量多。
python classification time-series matplotlib timeserieschart
图表在正常情况下相当不错。但我希望它在缩放时调整条宽。没有缩放的图形如下。
当我放大图形时,条形宽度保持不变,非常细!
反正他们会自动调整吗?我看到一个链接,其中示例通过缩放调整条宽。但我看不出有什么遗漏。这是示例:http : //blog.trifork.com/2014/07/29/creating-charts-with-c3-js/
这是我的图表代码。我错过了一些设置吗?
var chart = c3.generate({
bindto: '#chart',
data: {
xFormat: '%m/%d/%y %I:%M %p',
json: final_data,
keys: {
x: 'date',
value: values
},
type: 'bar',
groups: val
},
bar: {
width: { ratio: 0.9 }
},
axis: {
x: {
type: 'timeseries',
tick: {
format: '%b %d'
}
}
},
zoom: {
enabled: true
},
color: {
pattern: colors
}
});
Run Code Online (Sandbox Code Playgroud) timeserieschart ×10
python ×5
time-series ×4
java ×2
jfreechart ×2
matplotlib ×2
pandas ×2
plotly ×2
bokeh ×1
c3.js ×1
charts ×1
lattice ×1
numpy ×1
overlay ×1
python-3.x ×1
r ×1
tooltip ×1
width ×1
xts ×1