我使用python和matplotlib来生成图形输出.
有没有一种简单的方法来生成点划线式?
我知道的'--'
,'-.'
和':'
选项.不幸的是,'-..'
不会产生点划线.
我查看了set_dashes
命令,但这似乎控制了破折号的长度和两个相邻破折号之间的空间.
一种选择可以是在彼此的顶部绘制两条线; 在破折号之间留有足够空间的一个虚线 - 并且一个虚线,与破折号一样大的点宽且间隔开,使得两个点位于每个破折号之间.我不怀疑这可以做到,我只是希望有一个更简单的方法.
我忽略了一个选择吗?
我试图在非常稀疏的数据集上应用随机投影方法.我找到了关于Johnson Lindenstrauss方法的论文和教程,但是每一个方法都充满了方程式,对我没有任何有意义的解释.例如,关于Johnson-Lindenstrauss的这份文件
不幸的是,从这个文档中,我不知道算法的实现步骤.这是一个很长的镜头,但有谁能告诉我简单的英文版本或非常简单的算法伪代码?或者我在哪里可以开始挖掘这个方程式?有什么建议?
例如,通过阅读有关Johnson-Lindenstrauss的论文,我从算法中理解的是:
AxB
矩阵,其中A
是样本B
数,是维数,例如100x5000
.我想减小它的尺寸500
,这将产生一个100x500
矩阵.据我所知:首先,我需要构建一个100x500
矩阵并随机填充条目+1
和-1
(概率为50%).
编辑:
好的,我想我开始明白了.因此,我们有一个矩阵A
是mxn
.我们希望减少它E
是mxk
.
我们需要做的是,建立一个矩阵R
具有nxk
尺寸,并与填充它0
,-1
或者+1
,对于2/3
,1/6
和1/6
概率.
在构造之后R
,我们将简单地进行矩阵乘法AxR
以找到我们的简化矩阵E
.但我们并不需要做一个完整的矩阵乘法,因为如果一个元素Ri
是0
,我们不需要做计算.简单地跳过它.但是如果我们面对1
,我们只需要添加列,或者如果是-1
,只需从计算中减去它.所以我们只需使用求和而不是乘法来找到E
.这就是使这种方法非常快的原因.
事实证明这是一个非常简洁的算法,虽然我觉得这个想法太愚蠢了.
我试图在跳转后根据图形绘制双底x轴:
这是一个半小时的semilogx图,其中包含代表分钟,月和年的额外特定刻度.如何创建这些额外的刻度?
这是一个生成图表的最小例子,它说明了我的问题:
import matplotlib.pylab as plt
import matplotlib.mpl as mpl
import numpy as np
import random
data = [[random.random() for i in range(10)] for j in range(10)]
[XT, YT] = np.meshgrid(np.arange(1,10+1,1), np.arange(1,10+1,1))
cmap = mpl.cm.gray
fig, ax = plt.subplots()
CS = ax.contour(XT, YT, data,levels=np.arange(0,1+0.1,0.1),\
cmap=cmap,linewidths=0.75)
CB = plt.colorbar(CS, ticks=np.arange(0,1+0.1,0.1))
plt.show()
Run Code Online (Sandbox Code Playgroud)
结果图看起来像这样:
我想保留图linewidths
中的轮廓线,0.75
但增加它们colorbar
(为了更好的可读性).
如何linewidths
在colorbar
不更改图中的情况下更改?
我最初尝试过CB.collections
,但colorbar
没有collections
.此外,colorbar
使用参数调用linewidths=4.0
不起作用(它是一个未知参数).
评论
在输入这个问题时,我有了这个想法(橡皮鸭调试):
CS = ax.contour(XT, …
Run Code Online (Sandbox Code Playgroud) 我在向我的散点图添加注释时遇到问题。我使用 pandas 数据框作为我的数据源,其中包含 Lat、Long 列,文本是索引。我生成的嵌套在布局参数下的注释参数如下所示:
[dict(x= d[1]['Lat'], y= d[1]['Long'], text= d[0]) for d in df.iterrows()]
Run Code Online (Sandbox Code Playgroud)
相反,我可以只使用一行的单个注释(甚至出于测试目的硬编码值)。看起来 x,y 放置是使用图表网格而不是地图网格来放置注释。是否有参数可以解决这个问题,或者我是否需要调整图表网格本身?先感谢您。
编辑:这是一个例子。我希望通过将纬度/经度坐标作为注释的 x,y 变量传递来将注释放在每个气泡旁边。
我想为该方程式编写代码:T2(i)=T1(i)+2*[T1(i-1)+T1(i+1)]
syms T1 T2
function [T2] = stat(T1)
for i=1:3
T2(i)=T1(i)*2+[T1(i-1,)+T1(i+1,)]*2
end
Run Code Online (Sandbox Code Playgroud)
我想编写代码T2(111)=T1(111)+2*[T1(011)+T(211)]
,循环继续进行。但是matlab给出了这个错误
“在提示或脚本中不允许使用功能定义”
我怎么解决这个问题?
我跟着一个小教程,让我靠近我想要的地方,但它不是那里,我不知道如何用它做下一步.
这是'我目前的数字:
我不知道如何将渐近线绘制到此图中.
我想我需要创建一个名为Y
垂直线的变量,然后绘制出那条线?我不确定这是否正确
在这种情况下,我如何为渐近线创建线?
编辑
import pylab as pl
import numpy as np
import matplotlib.pyplot as plt
"""
This is all from the tutorial located at :
http://scipy-lectures.github.io/intro/matplotlib/matplotlib.html
"""
pl.figure(figsize=(10, 6), dpi=80)
pl.subplot(1, 1, 1)
X = np.linspace(-5, 5, 500, endpoint=True)
C = (1/X**2)-5
P = X - X - 0.1
pl.xlim(X.min() * 1.1, X.max() * 1.1)
pl.ylim(C.min() * 1.1, C.max() * 1.1)
"""
Alters the position of the axis - moves them to the centre …
Run Code Online (Sandbox Code Playgroud) Matlab具有以下检查输入的功能:
对于A = 1
(或任何"标量"输入)以上所有返回true
.
为什么我会看到这种反直觉行为?
我将如何识别A = 1
为标量?
如何为使用的绘图设置纵横比twinx
?
下面,我提供三个例子:
twinx
突出我如何设置宽高比 twinx
用于说明如何重置先前定义的宽高比 y
轴的纵横比twinx
(这不起作用)我正在使用matplotlib 1.3.0
以下脚本说明了我如何设置简单绘图的纵横比:
import numpy as np
import matplotlib.pyplot as plt
x = np.linspace(0,1.6,50) + 50.0
fig = plt.figure()
ax = fig.add_subplot(111)
XLIM = [50.0, 51.6]
YLIM = [0.0, 1.1, 0.0, 11.0]
ax.plot(x,np.sin(x-50.0),'b')
ax.set_xlim([XLIM[0], XLIM[1]])
ax.set_ylim([YLIM[0], YLIM[1]])
ax.set_xticks(np.arange(XLIM[0], XLIM[1], 0.2))
ax.set_yticks(np.arange(YLIM[0], YLIM[1]+0.1, 0.1)[:-1])
ax.grid(True,which='major',linestyle='solid')
ax.set_aspect((XLIM[1]-XLIM[0])/(YLIM[1]-YLIM[0]))
plt.show()
Run Code Online (Sandbox Code Playgroud)
这个产生的数字有一个明确的宽高比:
但是,如果我想y
使用该twinx()
函数添加额外的-axis ,则重置宽高比:
import numpy as np
import matplotlib.pyplot as plt
x = np.linspace(0,1.6,50) + …
Run Code Online (Sandbox Code Playgroud) 我刚刚遇到了matlab编程的问题.我想尝试从类中调用一个方法,我的类很简单
classdef Addition
properties
a;
b;
end
methods
function obj = Addition(a, b)
obj.a = a;
obj.b = b;
end
function add(c, d)
fprintf(c + d);
end
end
end
Run Code Online (Sandbox Code Playgroud)
我初始化了一个并尝试通过调用add函数
a = Addition(1, 2)
a.add(2,4)
Run Code Online (Sandbox Code Playgroud)
但是,matlab给出的错误是:
使用添加/添加时出错
输入参数太多.
有人可以告诉我为什么会发生这种奇怪的事情吗?