http://mpld3.github.io/examples/linked_brush.html的mpld3(matplotlibon d3)示例提供了以下代码示例:LinkedBrush
import numpy as np
import matplotlib
import matplotlib.pyplot as plt
from sklearn.datasets import load_iris
import mpld3
from mpld3 import plugins, utils
data = load_iris()
X = data.data
y = data.target
# dither the data for clearer plotting
X += 0.1 * np.random.random(X.shape)
fig, ax = plt.subplots(4, 4, sharex="col", sharey="row", figsize=(8, 8))
fig.subplots_adjust(left=0.05, right=0.95, bottom=0.05, top=0.95,
hspace=0.1, wspace=0.1)
for i in range(4):
for j in range(4):
points = ax[3 - i, j].scatter(X[:, …Run Code Online (Sandbox Code Playgroud) 我有一个交互式绘图的示例(来自 matplotlib),我可以从系列中选择要在绘图上显示的行。这工作完美,但现在我想将其导出为 html。我可以成功地做到这一点,mpld3.save_html()但失去了系列选择的交互性。这是代码
import numpy as np
import matplotlib.pyplot as plt, mpld3
from matplotlib.widgets import CheckButtons
t = np.arange(0.0, 2.0, 0.01)
s0 = np.sin(2*np.pi*t)
s1 = np.sin(4*np.pi*t)
s2 = np.sin(6*np.pi*t)
fig, ax = plt.subplots()
l0, = ax.plot(t, s0, visible=False, lw=2)
l1, = ax.plot(t, s1, lw=2)
l2, = ax.plot(t, s2, lw=2)
plt.subplots_adjust(left=0.2)
rax = plt.axes([0.05, 0.4, 0.1, 0.15])
check = CheckButtons(rax, ('2 Hz', '4 Hz', '6 Hz'), (False, True, True))
def func(label):
if label == '2 Hz': l0.set_visible(not l0.get_visible()) …Run Code Online (Sandbox Code Playgroud) 我有一个包含 150 个变量的列表,它们具有以下可能值:
domain = ['val1', 'val2', 'val2']
Run Code Online (Sandbox Code Playgroud)
我想将它们转换为用作 matplot 散点图的颜色。目前,我编写了一个函数来手动从数据域映射到颜色范围,例如:
colors = ['aquamarine','purple','blue']
color_map = dict(zip(domain, colors))
colorize = lambda x : color_map[x]
c = list(map(colorize, labels))
#and then I explicitly pass the array to scatter:
scatter = ax.scatter(t_x,
t_y,
c=c,
alpha=0.3,
cmap=plt.cm.cool,
s = 500)
Run Code Online (Sandbox Code Playgroud)
然而,这是有效的,我必须指定我的域的每个元素映射到的颜色。有没有办法让 matplotlib 为我做到这一点,这样我就可以利用 cmaps 了?D3 有一种从数据域映射到颜色范围的方法。
使用创建动画图片有很多惊人的可能性mpld3.但是,似乎所有"移动部件"都是JavaScript的责任.此外,互联网和Stack Overflow上有很多请求,人们直接要求这种可能性.
如何"转储"使用LinkedBrush插件为mpld3选择的点数?
其中有引用,但所有答案都错了,因为他们建议使用某种警报或标题.然而,第二个链接最有趣,因为它建议添加一些HTML表单并按下按钮以从"client-javascript"将数据发送到"server-python".还有一个有趣的笔记本
http://nbviewer.jupyter.org/gist/aflaxman/11156203
这被很多人提到作为灵感来源 - 它将输出配置保存为.html文件.也许这个硬盘交换可以用来通过python进一步处理这些信息.
我发现IPYwidgets,通过大量示例甚至是TRUE交互客户端 - 服务器的可能性,我进一步发现了这一点.从本质上讲,我们可以从基本的滑块和按钮开始,但后来我们看到在此基础上构建了一些更复杂的包:主要是bqplot和其他一些继承的包.
我想要的 - 只是拖放图片上的一些点,然后将它们传递给iPython进行更多的绘图 - 它非常复杂,绝对无法移动到JavaScript.但似乎尽管团队bqplot做了大量工作,但您只能使用一些"预定义"的交互集,因此再次不包括拖放行为.
当我尝试(不是非常深入地)输入mpld3的源代码并修改它并可能与ipywidgets合并时,我遇到很多东西都被弃用了,代码发展得非常快,这与互联网上现有的例子不一致:大多数杨树都很旧,询问也很老.所以我因为混乱而无能为力,许多例子由于缺乏向后兼容性而失败.
摘要.我很高兴,如果有人提供了一些方法来拖放点并将他们的坐标传递给python,但这对我更有帮助 - 是能够以更"抽象的方式"从mpld3传递信息,以便其他案件可以包括在内.
使用下面的代码,我可以获得带有4个图的2x2图.使用画笔,我可以选择一些数据点.我的问题是如何将选定的数据点作为JSON数组或cvs.此代码使用mlpd3,但散景可以使用画笔进行类似的选择.但是没有选择数据点的示例.我试图将选定的数据作为对象继续使用python进行处理.在单元格中查看数据会很高兴.
%matplotlib inline
import numpy as np
import matplotlib.pyplot as plt
import matplotlib as mat
import mpld3
mpld3.enable_notebook()
from mpld3 import plugins
fig, ax = plt.subplots(2, 2, figsize=(10, 8))
fig.subplots_adjust(hspace=0.1, wspace=0.1)
ax = ax[::-1]
X = np.random.normal(size=(2, 100))
for i in range(2):
for j in range(2):
ax[i, j].xaxis.set_major_formatter(plt.NullFormatter())
ax[i, j].yaxis.set_major_formatter(plt.NullFormatter())
points = ax[i, j].scatter(X[j], X[i])
plugins.connect(fig, plugins.LinkedBrush(points))
Run Code Online (Sandbox Code Playgroud)
Bokeh在CustomJS for Selections中具有类似的行为
无论哪一个更容易提取所选项目 - 都可行..如果有一个Plotly解决方案,那也可以.
如果我跑
import pandas as pd
import mpld3
import seaborn as sns
df = pd.DataFrame([(1,3),(2,-1)],columns= ['a','b'])
plt.figure(figsize=(5,5))
sns.regplot('a', 'b', df)
Run Code Online (Sandbox Code Playgroud)
工作良好.如果我加
mpld3.enable_notebook()
Run Code Online (Sandbox Code Playgroud)
我得到错误:'ndarray'类型的对象不是JSON可序列化的
你对mpld3引起这种烦恼的原因有什么建议吗?
对于我能理解的内容,这不是NumPy数组中提出的问题不是JSON序列化 问题在我的问题中,我问的是如何使mpld3工作或至少不使其他一切都不起作用.
在IPython笔记本中有令人惊奇的mpld3用于交互式matplotlib图.mpld3还具有插件功能.一个对我来说特别有趣:你可以在情节中选择一个点并拖动它 - 它在这里显示:
http://mpld3.github.io/examples/drag_points.html.
链接中的源代码生成下面的图表.我想从插件中获取信息,我已经将我的观点拖到了.但我真的迷失在javascript部分以及如何从中获取信息.

我试图使用mpld3-flask示例(https://github.com/nipunreddevil/mpld3-flask)作为模板来实现某种行为.我想要的是将标题栏上的链接添加到不同的图表,而不是使用单选按钮查询表单.
现在,上面的示例代码在templates/index.html中创建一个容器,然后在用户通过单击"查看绘图"按钮提交查询时用绘图填充它.就我所知,在index.html中,这个代码会发生这种情况:
$("#query").click(function() {
$("#loading-div-background").show();
$("#container").hide();
var plot_type = $('input:radio[name=plot_type]:checked').val();
var qu = {"plot_type":plot_type}
$.ajax({
type: "POST",
async:true,
contentType: "application/json; charset=utf-8",
url: "/query",
data: JSON.stringify(qu),
success: function (data) {
var graph = $("#container");
graph.html(data);
$("#loading-div-background").hide();
$("#container").show();
},
dataType: "html"
});
});
Run Code Online (Sandbox Code Playgroud)
我想要的是添加到当前包含"Home"的标题栏中,并在不同的页面中显示每个示例图.我将路由到另一个链接,然后使用绘图的数据填充模板html代码,而无需用户查询.
我对html有点新手,而且在这一点上基本上对JavaScript一无所知.我的感觉是有一些相对简单的方法来使用flask + jinja2来做到这一点,但我无法弄明白.
我在组合所有这些语言时产生的那种不清楚的命名空间方面遇到了一些麻烦.在我自己的python编程中,我通常对命名空间非常严格(即我永远不会使用'来自____ import*')所以这让我有点疯狂.
我正在探索mpld3库,无法弄清楚如何创建3D散点图.使用Matplotlib,我会这样做:
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
ax.scatter([1],[5],[7])
plt.show()
Run Code Online (Sandbox Code Playgroud)
同样,用mpld3我试过(在Jupyter笔记本中):从mpl_toolkits.mplot3d导入matplotlib.pyplot作为plt导入Axes3D导入mpld3
mpld3.enable_notebook()
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
ax.scatter([1],[5],[7])
mpld3.display(fig)
Run Code Online (Sandbox Code Playgroud)
我得到了错误
TypeError: array([ 0.94, 1.06]) is not JSON serializable
Run Code Online (Sandbox Code Playgroud)
有任何想法吗?
这是完整的错误日志:
Traceback (most recent call last) <ipython-input-26-54fc4a65da87> in <module>()
6 N = 50
7 ax.scatter([1],[5],[7])
----> 8 mpld3.display(fig)
/usr/local/lib/python2.7/dist-packages/mpld3/_display.pyc in display(fig, closefig, local, **kwargs)
288 if closefig:
289 plt.close(fig)
--> 290 return HTML(fig_to_html(fig, **kwargs))
291
292
/usr/local/lib/python2.7/dist-packages/mpld3/_display.pyc in fig_to_html(fig, d3_url, mpld3_url, …Run Code Online (Sandbox Code Playgroud) 我正在使用 matplotlib 从数据库绘制一个大型数据集,并使用 mpld3 将图形传递到浏览器。X 轴上有日期。这里的问题是,虽然在没有 mpld3 的情况下绘图工作正常,但当我使用它时,日期显示不正确。
这是我的代码:
date1 = '2015-04-22 20:28:50'
date2 = '2015-04-23 19:42:09'
db = Base('monitor').open()
result_set = db.select(['MeanVoltage','time'],"time>=start and time<=stop", start=date1, stop=date2)
V = [float(record.MeanVoltage) for record in result_set if record != 0]
Date = [str(record.time) for record in result_set]
dates = [datetime.datetime.strptime(record, '%Y-%m-%d %H:%M:%S') for record in Date]
dates = matplotlib.dates.date2num(dates)
fig, ax = plt.subplots()
plt.gca().xaxis.set_major_formatter(mdates.DateFormatter('%m/%d/%Y %H:%M:%S' ))
plt.gcf().autofmt_xdate()
ax.plot(dates,V)
#mpld3.fig_to_html(fig)
#mpld3.show(fig)
plt.show()
Run Code Online (Sandbox Code Playgroud)
完美地显示了情节,如下所示:
。
现在,如果我只注释掉这一行:
plt.show()
Run Code Online (Sandbox Code Playgroud)
并取消注释这两个:
mpld3.fig_to_html(fig)
mpld3.show(fig)
Run Code Online (Sandbox Code Playgroud)
该图在浏览器中显示如下:

正如您所看到的,唯一的问题是日期在 x 轴上的显示方式。有什么办法可以克服吗?
mpld3 ×10
python ×10
matplotlib ×7
javascript ×2
axis-labels ×1
bokeh ×1
date ×1
flask ×1
interactive ×1
ipywidgets ×1
json ×1
plotly ×1