如何在Python中使用R通过Django返回R图?
我试图通过Django应用程序运行下面的R代码,最终结果是PythonDjango网页中打印的R图。这是R的代码如何在Python中使用R通过Django返回R图?,python,r,django,Python,R,Django,我试图通过Django应用程序运行下面的R代码,最终结果是PythonDjango网页中打印的R图。这是R的代码 t=read.table(file=file("request.FILES['fileUpload']")) colnames(t) <- c('x', 'y') t = data.frame(t) fit1 = lm(y ~ x, data = t) par(mfrow=c(1,1)) plot(x=t$x, y=t$y, xlab="x", ylab="y", main="
t=read.table(file=file("request.FILES['fileUpload']"))
colnames(t) <- c('x', 'y')
t = data.frame(t)
fit1 = lm(y ~ x, data = t)
par(mfrow=c(1,1))
plot(x=t$x, y=t$y, xlab="x", ylab="y", main="Simple Linear Regression", xlim=c(0,100), ylim=c(0,6), par=20)
abline(fit1, col="red")
t=read.table(file=file(“request.FILES['fileUpload']))
colnames(t)
响应=RGraph
返回响应
或
返回呈现(请求'Regression/index.html',{'graph':response})
返回呈现(请求“Regression/index.html”)
HTML代码如下所示
<html>
<title>Import File</title>
<body>
<h1>Import File</h1>
<hr>
{% if graph %}
<img alt="my base64 graph" src="data:image/png;base64,{{graph}}" />
{% endif %}
<form enctype="multipart/form-data" method="post">
{% csrf_token %}
<input type="file" name="fileUpload" />
<input type="submit" value="Submit" />
</form>
</body>
</html>
导入文件
导入文件
{%if图%}
{%endif%}
{%csrf_令牌%}
一如既往,谢谢你的帮助
Rscript
以使其正常工作。该脚本可以基于许多输入参数生成png。Python随后可以获取png并将其发送回用户Rserve
运行R,并创建到它的连接以完成打印。例如,请参见解决方案3有点过分,但允许您在不同于Django实例的服务器上使用R。解决方案1。它相当灵活,但更复杂。最后,解决方案2。是最简单的解决方案,但有时缺乏灵活性,特别是在需要R和Python之间进行大量交互的情况下。显然rpy2不提供可以将文件对象返回Python的直接函数。因此,我建议: 1) 设置保存R图像文件的路径
- 在settings.py上定义一个变量,用于保存R脚本/图像
STATIC_R = 'r_plots'
- 模型
from django.conf import settings class RScript(models.Model): script = FileField(upload_to=settings.STATIC_R) @property def script_path(self): return os.path.basename(self.script.name)
- 请记住(从文档中):FielField.upload\u to:一个本地文件系统路径,将附加到媒体根设置中,以确定url属性的值
- 形式
class RScriptForm(forms.ModelForm): class Metal: model = RScript fields = ('script',)
- 接收您的R脚本并保存它
my_plot_script = ''' t=read.table(file=file("{path}")) colnames(t) <- c('x', 'y') t = data.frame(t) fit1 = lm(y ~ x, data = t) par(mfrow=c(1,1)) png(filename="{path}.png") plot = plot(x=t$x, y=t$y, xlab="x", ylab="y", main="Simple Linear Regression", xlim=c(0,100), ylim=c(0,6), par=20) abline(fit1, col="red") dev.off() ''' def my_view(request): if request.method == 'POST': form = RScriptForm(request.POST) if form.is_valid(): form.save() (...)
,则可以使用my_plot_script='' t=read.table(file=file(“{path}”))
colnames(t)如果在R实例中安装.package('magick')
将图像数据返回到Python,如下所示(我使用了一个更简单的绘图函数):rpy2
从io导入字节io 将PIL.Image作为图像导入 将rpy2.robjects作为ro导入 def main(): r=ro.r r(“”) 图书馆(“魔法”)
figure抱歉,但这里的问题是什么?我编辑了标题以澄清问题。只需在模板中创建一个
,用
指向src
生成的图形就足够了。但是我如何通过Python创建图形。我现在正在研究rpy2,我发现importr和l出现了错误m函数。你能告诉我如何在代码中执行此操作吗?这个答案对我帮助不大。你能告诉我如何使用我发布的代码执行此操作吗?请并谢谢。好的。给我几分钟:)谢谢你花时间来解决此问题。我在OP.@Poppins586中添加了index.html代码。你能说出R脚本/func中的哪一行是生成要打印的图像的行吗?我不熟悉Rone生成的图,而另一个将线性回归放在图上。这两行是我发布的代码中的最后两行。--plot(x=t$x,y=t$y,xlab=“x”,ylab=“y”,main=“简单线性回归”,xlim=c(0100),ylim=c(0,6),par=20)abline(fit1,col=“红色”)R
my_plot_script = ''' t=read.table(file=file("{path}")) colnames(t) <- c('x', 'y') t = data.frame(t) fit1 = lm(y ~ x, data = t) par(mfrow=c(1,1)) png(filename="{path}.png") plot = plot(x=t$x, y=t$y, xlab="x", ylab="y", main="Simple Linear Regression", xlim=c(0,100), ylim=c(0,6), par=20) abline(fit1, col="red") dev.off() ''' def my_view(request): if request.method == 'POST': form = RScriptForm(request.POST) if form.is_valid(): form.save() (...)
my_plot_script = ''' t=read.table(file=file("{path}")) colnames(t) <- c('x', 'y') t = data.frame(t) fit1 = lm(y ~ x, data = t) par(mfrow=c(1,1)) png(filename="{path}.png") plot = plot(x=t$x, y=t$y, xlab="x", ylab="y", main="Simple Linear Regression", xlim=c(0,100), ylim=c(0,6), par=20) abline(fit1, col="red") dev.off() ''' def my_view(request): context = {} if request.method == 'POST': form = RScriptForm(request.POST) if form.is_valid(): form.save() import rpy2.robjects as robjects robjects.r(my_plot_script.format(form.instance.script_path)) context['graph'] = form.instance.script_path + '.png' return render(request, 'Regression/graph.html', context)
<html> <title>Import File</title> <body> <h1>Import File</h1> <hr> {% if graph %} <img alt="my base64 graph" src="{{graph}}" /> {% endif %} <form enctype="multipart/form-data" method="post"> {% csrf_token %} <input type="file" name="fileUpload" /> <input type="submit" value="Submit" /> </form> </body> </html>
from io import BytesIO import PIL.Image as Image import rpy2.robjects as ro def main(): r = ro.r r(''' library("magick") figure <- image_graph(width = 400, height = 400, res = 96) plot(c(1,2,3)) image <- image_write(figure, path = NULL, format = "png") ''') image_data = ro.globalenv['image'] image = Image.open(BytesIO(bytes(image_data))) return image if __name__ == '__main__': image = main() image.show()