我有两台不同的机器,安装了scipy 0.12和PIL.在一台机器上,当我尝试读取.png文件时,它返回一个大小为整数的数组(wxhx 3):
In[2]: from scipy.ndimage.io import imread
In[3]: out = imread(png_file)
In[4]: out.shape
Out[4]: (750, 1000, 4)
Run Code Online (Sandbox Code Playgroud)
在另一台机器上,使用相同的图像文件,这将返回一个PIL.PngImagePlugin.PngImageFile包装在数组中的对象
In[2]: from scipy.ndimage.io import imread
In[3]: out = imread(png_file)
In[4]: out.shape
Out[4]: ()
In[5]: out
Out[5]: array(<PIL.PngImagePlugin.PngImageFile image mode=RGBA size=1000x750 at 0x1D40050>, dtype=object)
Run Code Online (Sandbox Code Playgroud)
我看不到任何方法来访问后一个对象的数据.
我有一种模糊的感觉,即PIL使用Png库来读取图像的方式有问题,但是有哪些更具体的错误会导致这种行为?
GH问题#3343
我正在使用imshowmatplotlib中的函数来可视化一些数据.我所拥有的是两个大小相同的阵列A和B. 我想使用色图来显示A中的标量值,我想使用alpha通道来显示B中的标量值.换句话说,如果A和B中给定坐标处的值都很大,则图中的像素将是亮绿色和不透明的.如果它在A而不是B中很大,那么它将是亮绿色但大部分是透明的.如果它在B而不是A中很大,那么它将是不透明的但是是白色的.
但是,生成的图像不是我所期望的.调用我的输入数据d,它是将A数组映射到matplotlib色彩图(即mpl.cm.BuGn(A))和B数组所产生的RGB值的组合.
在这里,我将绘制完整的图像(我想要实际使用的),RGB图像(A,映射BuGn)和提供alpha的数组(B,带有灰度色彩图).
f, (ax0, ax1, ax2) = plt.subplots(1, 3, figsize=(5, 2.5))
ax0.imshow(d)
ax1.imshow(d[..., :-1])
ax2.imshow(d[..., -1])
Run Code Online (Sandbox Code Playgroud)

我很困惑完整图像中的斑点灰色垃圾来自哪里,因为色彩图中没有任何值是那些颜色.为了更显着地显示这种效果,我可以更改色彩映射的边界,使它们远离数据的极值并重新绘制:

我不明白为什么具有大alpha值的白色像素显示为灰色.不透明的白色应该仍然是白色的.
请注意,此行为与我绘制RGB组件数组并降低与alphakwarg 的透明度相同,即ax2.imshow(d[..., :-1], alpha=.3):

我正在使用matplotlib(版本1.4)来创建我需要以.tiff格式保存的图像.我正在使用%matplotlib inline后端在IPython笔记本(版本3.2)中进行绘图.通常我使用Anaconda发行版,并且能够将matplotlib数字保存到.tiff没有问题.但是,我正在尝试将一组最小的依赖项组合在一起,我可以将其作为conda环境共享.目前,我正在使用:
当我在这个环境中运行我的代码时,我收到一个错误:
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
<ipython-input-14-3d911065b472> in <module>()
56 f.text(.01, .38, "B", size=14)
57
---> 58 savefig(f, "switch_control")
<ipython-input-6-4016f8a0f32d> in savefig(fig, name)
----> 4 fig.savefig("figures/{}.tiff".format(name), dpi=300)
/Users/mwaskom/anaconda/envs/punch/lib/python2.7/site-packages/matplotlib/figure.pyc in savefig(self, *args, **kwargs)
1474 self.set_frameon(frameon)
1475
-> 1476 self.canvas.print_figure(*args, **kwargs)
1477
1478 if frameon:
/Users/mwaskom/anaconda/envs/punch/lib/python2.7/site-packages/matplotlib/backend_bases.pyc in …Run Code Online (Sandbox Code Playgroud) 我试图在python中使用seaborn生成多面板图,我希望我的多面板图中的点的颜色由连续变量指定.以下是我尝试使用"iris"数据集的示例:
import numpy as np
import pandas as pd
import seaborn as sns
import matplotlib as mpl
import matplotlib.pyplot as plt
iris = sns.load_dataset('iris')
g = sns.FacetGrid(iris, col = 'species', hue = 'petal_length', palette = 'seismic')
g = g.map(plt.scatter, 'sepal_length', 'sepal_width', s = 100, alpha = 0.5)
g.add_legend()
Run Code Online (Sandbox Code Playgroud)
这很好,但传说太长了.我想像这些值的1/4一样(理想情况下)或禁止显示颜色条.例如,这样的事情可能是可以接受的,但我仍然想把它分成三个物种.
plt.scatter(iris.sepal_length, iris.sepal_width, alpha = .8, c = iris.petal_length, cmap = 'seismic')
cbar = plt.colorbar()
Run Code Online (Sandbox Code Playgroud)
关于如何充分利用这两个情节的任何想法?
编辑:这个主题似乎是一个好的开始.
https://github.com/mwaskom/seaborn/issues/582
不知何故,对于这个用户,只需在其他所有运行之后附加plt.colorbar似乎以某种方式工作.但在这种情况下似乎没有帮助.
Matplotlib 提供的seaborn 样式自3.6 起已弃用,因为它们不再对应于seaborn 提供的样式。但是,它们仍将以“seaborn-v0_8-<style>”形式提供。或者,直接使用seaborn API。
我已经尝试过这个:
# use seaborn style
plt.style.use("seaborn")
Run Code Online (Sandbox Code Playgroud)
但它已被弃用,我想在 Windows 中使用 cmd 时删除此警告
我正在编写一个类,它有一些计算量很大的方法和一些用户希望迭代调整并且与计算无关的参数.
实际用途是用于可视化,但这是一个卡通示例:
class MyClass(object):
def __init__(self, x, name, mem=None):
self.x = x
self.name = name
if mem is not None:
self.square = mem.cache(self.square)
def square(self, x):
"""This is the 'computation heavy' method."""
return x ** 2
def report(self):
"""Use the results of the computation and a tweakable parameter."""
print "Here you go, %s" % self.name
return self.square(self.x)
Run Code Online (Sandbox Code Playgroud)
基本思想是用户可能希望使用相同x但不同的name参数创建此类的许多实例.我想允许用户提供一个joblib.Memory将缓存计算部分的对象,这样他们就可以"报告"许多不同的名称,而无需每次重新计算平方数组.
(我知道这有点奇怪.用户需要为每个名称设置不同的类实例的原因是他们实际上正在与看起来像这样的接口函数进行交互.
def myfunc(x, name, mem=None):
theclass = MyClass(x, name, mem)
theclass.report()
Run Code Online (Sandbox Code Playgroud)
但是现在让我们忽略它.
在joblib文档之后,我square …
所以我使用seaborn做一个kdeplot有sns.kdeplot(x, y, ax=plt.gca(), cmap="coolwarm").
我可以用levelskwarg 改变等级,但我也希望能够标记轮廓.在matplotlib你只需要做,plt.clabel(CS, CS.levels, inline=True)但seaborn不会返回轮廓集合CS.
我该怎么做?或者我只是自己从头开始做这件事?
编辑:有没有办法制作一个也会返回CS的包装器?我看不出怎么样......
我在Matplotlib中制作了很多图,其中外部数据点位于绘图空间的边缘,这通常会模糊重要数据.例如,我想做的事情如下:
f, ax = subplots(1, 1)
ax.plot([0, 1], [.25, .5], "o")
Run Code Online (Sandbox Code Playgroud)
正如所写的那样,我最终得到的图是x轴从0变为1,并且很难得到数据外观的印象(加上浪费了大量空间).
我想某种方法来重置x轴限制,以便a)它在每一侧增加空间,b)xticks以合理(默认)间隔覆盖整个x轴.显然在单例中我可以使用ax.set_xlim()和ax.set_xticks(),但是我生成了很多这些图,并且不知道调整图的最佳方法是什么.
Matplotlib中是否有一些选项可以设置x轴跨越或类似的x数据范围的百分比?
我想以编程方式测试两个散点图字形是否会在matplotlib中重叠.所以给出一对(x,y)坐标和一个大小(据我所知是圆的面积,以点为单位),我想绘制
plt.scatter(x, y, s=s)
Run Code Online (Sandbox Code Playgroud)
然后有一个调用的函数points_overlap,它接受这些参数,True如果这些点重叠False则返回.
def points_overlap(x, y, s):
if ...
return True
else:
return False
Run Code Online (Sandbox Code Playgroud)
我知道在不同的matplotlib坐标系之间有转换矩阵,但是我无法找到编写这个函数的正确步骤.
我正在尝试使用 Seaborn ( Reference )制作一个分组的箱线图,并且这些箱子都非常窄——太窄而无法看到分组颜色。
g = seaborn.factorplot("project_code",y="num_mutations",hue="organ",
data=grouped_donor, kind="box", aspect=3)
Run Code Online (Sandbox Code Playgroud)

如果我放大或将图形拉伸到屏幕宽度的几倍,我可以看到这些框,但显然这作为标准图形没有用。
这似乎是我的数据量的函数;如果我只绘制前 500 个点(6000 个),我会得到可见但很小的框。它可能特别是我的数据高方差的函数;根据 matplotlib boxplot 文档,
默认 [宽度] 为 0.5,如果较小,则为 0.15x(极端位置之间的距离)。
不管什么原因,如果我可以加宽它们,图表本身就有足够的空间来容纳更宽的盒子。
不幸的是,widths控制框宽度的 boxplot 关键字不是一个有效的factorplot关键字,我找不到一个 matplotlib 函数来改变绘图函数本身之外的条或框的宽度。我什至找不到任何人讨论这个;我发现最接近的是箱线图线宽。有什么建议?
python ×9
matplotlib ×8
seaborn ×4
anaconda ×1
boxplot ×1
graph ×1
joblib ×1
memoization ×1
scipy ×1