可以使用传统的绘图类型相对直观地查看二维和三维数据.即使使用四维数据,我们也经常可以找到显示数据的方法.但是,高于4的尺寸变得越来越难以显示.幸运的是,平行坐标图提供了一种查看更高维度结果的机制.
几个绘图包提供了平行坐标图,例如Matlab,R,VTK类型1和VTK类型2,但我没有看到如何使用Matplotlib创建一个.
编辑:
根据以下振亚提供的答案,我开发了以下支持任意数量轴的概括.按照我在上面原始问题中发布的示例的绘图样式,每个轴都有自己的比例.我通过对每个轴点的数据进行归一化并使轴的范围为0到1来实现这一点.然后返回并为每个刻度线应用标签,在该截距处给出正确的值.
该函数通过接受可迭代的数据集来工作.每个数据集被认为是一组点,其中每个点位于不同的轴上.该示例在__main__
两组30行中抓取每个轴的随机数.线条在引起线条聚类的范围内是随机的; 我想验证的行为.
这个解决方案不如内置解决方案好,因为你有奇怪的鼠标行为,而且我通过标签伪造数据范围,但在Matplotlib添加内置解决方案之前,它是可以接受的.
#!/usr/bin/python
import matplotlib.pyplot as plt
import matplotlib.ticker as ticker
def parallel_coordinates(data_sets, style=None):
dims = len(data_sets[0])
x = range(dims)
fig, axes = plt.subplots(1, dims-1, sharey=False)
if style is None:
style = ['r-']*len(data_sets)
# Calculate the limits on the data
min_max_range = list()
for m in zip(*data_sets):
mn = min(m)
mx = max(m)
if mn == mx:
mn …
Run Code Online (Sandbox Code Playgroud) 描述我想要实现的目标的最佳方式是使用我自己的图像:
现在我在光谱图中有很多死区,特别是在5200和6300之间.我的问题非常简单,我将如何添加一个看起来与此类似的漂亮的小//中断(从网上抬起的图像):
我正在使用此设置为我的情节:
nullfmt = pyplot.NullFormatter()
fig = pyplot.figure(figsize=(16,6))
gridspec_layout1= gridspec.GridSpec(2,1)
gridspec_layout1.update(left=0.05, right=0.97, hspace=0, wspace=0.018)
pyplot_top = fig.add_subplot(gridspec_layout1[0])
pyplot_bottom = fig.add_subplot(gridspec_layout1[1])
pyplot_top.xaxis.set_major_formatter(nullfmt)
Run Code Online (Sandbox Code Playgroud)
我非常肯定它可以通过gridpsec实现,但是一个高级教程确切地说明了如何实现这一点将非常感激.
如果这个问题之前已经在stackoverflow上处理过,但我已经广泛地查看了正确的程序,gridSpec
但尚未找到任何内容.
我已经设法走了这么远,几乎就在那里:
但是,我的断线并不像我想的那样陡峭...我该怎么改变它们?(我已经使用了下面的示例答案)
这是绘制大值的示例.
import matplotlib.pyplot as plt
x = [1,2,3,4,5]
y = [1000, 1002, 1001, 1003, 1005]
plt.bar(x,y)
plt.show()
Run Code Online (Sandbox Code Playgroud)
y轴从0开始,因此条都看起来相等.我知道你可以使用plt.ylim来手动设置限制,但matplotlib是否有办法自动(并巧妙地)将限制设置为合理的值(如998-1008),也可能显示轴中断?
我想在matplotlib生成的图中仅显示x轴上的相关部分 - 使用pyplot
包装器库.
问题:如何通过传递间隔范围的元组来强制绘制某些轴位置的截止值,这些元组定义了要绘制的x轴的间隔.理想情况下,截止值应表示为叠加在x轴上的垂直双波符号.
使用xlim
和axis
没有用,因为它只允许设置x轴的开始和结束,但中间没有间隔:
具体而言,对于上图,
60 to 90
不应显示之间的x轴区域,并应添加截止/不连续标记标记.
import matplotlib.pyplot as pyplot
x1, x2 = 0, 50
y1, y2 = 0, 100
pyplot.xlim([x1, x2])
#alternatively
pyplot.axis([x1, x2, y1, y2])
Run Code Online (Sandbox Code Playgroud)
使用matplotlib不是必需的.
更新/摘要:
subplots
-splitting和两个图来模拟matplotlib/pyplot中的折线图.以下生成带有三个数据点的图,分别为(0,0),(0,0.5)和(1,1).只有位于绘图区域内的绘制点(小圆圈)的那部分是可见的,因此我看到角落中的四分之一圆圈和沿左脊柱的半圆圈.
有没有一个技巧可以让所有的点完全可见,所以它们不会被夹在轴框架内?
from matplotlib.backends.backend_agg import FigureCanvasAgg as FigureCanvas
from matplotlib.figure import Figure
fig = Figure()
canvas = FigureCanvas(fig)
ax = fig.add_subplot(111)
ax.plot([0, 0, 1], [0, 0.5, 1], 'o')
fig.canvas.print_figure('test.png')
Run Code Online (Sandbox Code Playgroud)
编辑: Amro的建议 - 显而易见的方法 - 不是首选方法,因为这些是ROC图(通常用两个轴上的0到1的方框绘制).如果我可以欺骗matplotlib产生与http://www.google.com/search?q=roc+plot上的许多类似的结果,这些结果在两个轴上都有一个紧紧围绕0..1的框,但是在顶部绘制了点轴线尽可能多,这将是最佳的.
编辑2:我猜这可以使用" 脊柱放置 "(新的MPL 0.99)完成,绘图区域略微放大,如Amro所示,但随后脊柱重新定位略微沿两个0轴.我将试验这个并发布一个答案,如果它有效,尽管可以随意打败我.
我获得了几个月的数据,但在几个月之间缺失了.如果我将整个数据集绘制在一个绘图中(其间有很多空白空间),这看起来很奇怪.我写了一个小例子脚本来展示它是如何工作的(基于:Python/Matplotlib - 有没有办法制作一个不连续的轴?)
问题:我无法让x轴使用相同的日期格式!ax或ax2都是正确的,但从来都不是.你有什么主意吗?
import numpy as np
import matplotlib as mpl
import matplotlib.pyplot as plt
import datetime
def getDates(startdate, enddate):
days = (enddate + datetime.timedelta(days=1) - startdate).days
dates = [ startdate + datetime.timedelta(days=x) for x in range(0,days) ]
return dates
dates1 = getDates(datetime.datetime(2013,1,1), datetime.datetime(2013,1,31))
dates2 = getDates(datetime.datetime(2013,3,1), datetime.datetime(2013,3,31))
dates = dates1+dates2
data = np.arange(len(dates))
Locator = mpl.dates.DayLocator(interval=5)
Formatter = mpl.dates.DateFormatter('%d-%m-%y')
fig,(ax,ax2) = plt.subplots(1,2,sharey=True)
fig.subplots_adjust(wspace=0.05)
fig.set_size_inches(10,3)
ax.plot(dates, data)
ax2.plot(dates, data)
ax.legend(loc=1)
ax.set_ylim( 0, 61 )
ax.set_xlim( datetime.datetime(2013,1,1), datetime.datetime(2013,1,31) …
Run Code Online (Sandbox Code Playgroud) 我正在使用 matplotlib 生成直方图。
我需要垃圾箱的宽度不等,因为我最感兴趣的是最低的垃圾箱。现在我正在这样做:
plt.hist(hits_array, bins = (range(0,50,10) + range(50,550,50)))
Run Code Online (Sandbox Code Playgroud)
这创建了我想要的(前 5 个 bin 的宽度为 10,其余为 50),但是前 5 个 bin 显然比后面的窄,因为所有 bin 都显示在同一轴上。
有没有办法影响 x 轴或直方图本身,以便我可以在前 5 个 bin 之后打破比例,以便所有 bin 显示为同等宽度?
(我意识到这会产生扭曲的视图,我对此很满意,尽管我不介意轴的两个不同比例的部分之间有一点空间。)
任何帮助将不胜感激。谢谢!