相关疑难解决方法(0)

Matplotlib中的平行坐标图

可以使用传统的绘图类型相对直观地查看二维和三维数据.即使使用四维数据,我们也经常可以找到显示数据的方法.但是,高于4的尺寸变得越来越难以显示.幸运的是,平行坐标图提供了一种查看更高维度结果的机制.

来自维基百科的示例平行坐标图

几个绘图包提供了平行坐标图,例如Matlab,R,VTK类型1VTK类型2,但我没有看到如何使用Matplotlib创建一个.

  1. Matplotlib中是否有内置的平行坐标图?我当然没有在画廊看到一个.
  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)

python matplotlib parallel-coordinates

47
推荐指数
5
解决办法
3万
查看次数

在matplotlib的x轴上中断//

描述我想要实现的目标的最佳方式是使用我自己的图像:

在此输入图像描述

现在我在光谱图中有很多死区,特别是在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但尚未找到任何内容.

我已经设法走了这么远,几乎就在那里:

在此输入图像描述

但是,我的断线并不像我想的那样陡峭...我该怎么改变它们?(我已经使用了下面的示例答案)

python plot matplotlib

18
推荐指数
2
解决办法
3万
查看次数

使用matplotlib自动设置条形图的y轴限制

这是绘制大值的示例.

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),也可能显示轴中断?

python matplotlib

15
推荐指数
1
解决办法
2万
查看次数

如何使用Matplotlib或python中的其他库设置轴间隔范围

我想在matplotlib生成的图中仅显示x轴上的相关部分 - 使用pyplot包装器库.

问题:如何通过传递间隔范围的元组来强制绘制某些轴位置的截止值,这些元组定义了要绘制的x轴的间隔.理想情况下,截止值应表示为叠加在x轴上的垂直双波符号.

使用xlimaxis没有用,因为它只允许设置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不是必需的.

更新/摘要:

  • Viktor指出这个来源,使用subplots-splitting和两个图来模拟matplotlib/pyplot中的折线图.

在此输入图像描述

python plot matplotlib range

6
推荐指数
2
解决办法
3万
查看次数

我如何绘制点,以便它们出现在matplotlib的脊柱顶部?

以下生成带有三个数据点的图,分别为(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轴.我将试验这个并发布一个答案,如果它有效,尽管可以随意打败我.

matplotlib

5
推荐指数
1
解决办法
344
查看次数

不连续的时间序列在x轴上绘制日期

我获得了几个月的数据,但在几个月之间缺失了.如果我将整个数据集绘制在一个绘图中(其间有很多空白空间),这看起来很奇怪.我写了一个小例子脚本来展示它是如何工作的(基于: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)

python numpy matplotlib

5
推荐指数
1
解决办法
1509
查看次数

在 Matplotlib 直方图中定义 bin 宽度/x 轴比例

我正在使用 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 显示为同等宽度?

(我意识到这会产生扭曲的视图,我对此很满意,尽管我不介意轴的两个不同比例的部分之间有一点空间。)

任何帮助将不胜感激。谢谢!

axis matplotlib

3
推荐指数
1
解决办法
2万
查看次数

标签 统计

matplotlib ×7

python ×5

plot ×2

axis ×1

numpy ×1

parallel-coordinates ×1

range ×1