我试图以整数格式而不是(R,G,B)格式指定图像的颜色.我认为我必须在模式"I"中创建一个图像,因为根据文档:
图像的模式定义图像中像素的类型和深度.当前版本支持以下标准模式:
- 1(1位像素,黑白,每字节存储一个像素)
- L(8位像素,黑白)
- P(8位像素,使用调色板映射到任何其他模式)
- RGB(3x8位像素,真彩色)
- RGBA(4x8位像素,带透明蒙版的真彩色)
- CMYK(4x8位像素,分色)
- YCbCr(3x8位像素,彩色视频格式)
- 我(32位有符号整数像素)
- F(32位浮点像素)
然而,这似乎是一个灰度图像.这是预期的吗?有没有办法根据32位整数指定彩色图像?在我的MWE中,我甚至让PIL决定如何将"红色"转换为"I"格式.
from PIL import Image
ImgRGB=Image.new('RGB', (200,200),"red") # create a new blank image
ImgI=Image.new('I', (200,200),"red") # create a new blank image
ImgRGB.show()
ImgI.show()
Run Code Online (Sandbox Code Playgroud) 如果您使用 matplotlib 绘制多条线或点,有时您可能会发现重复标签的情况。例如:
for i in range(5):
Y1=boatarrays[i]
Y2=cararrays[i]
ax.plot(X,Y1,color='r',label='Boats')
ax.plot(X,Y2,color='b',label='Cars')
Run Code Online (Sandbox Code Playgroud)
如何只拥有'Boats'且'Cars'只出现一次?
我想创建一个图例,在其中指定标记的值和行的值,但不能同时指定两者的组合。
这个例子应该有助于说明我的目标:
import matplotlib.pyplot as plt
import numpy as np
pi=3.14
xx=np.linspace(0,2*pi,100)
fig = plt.figure()
ax = fig.add_subplot(111)
phases=[0,pi/4,pi/2]
markers=['s','o','^']
for phase,mk in zip(phases,markers):
labeltext='Sine' + '*' + str(phase)
F=[np.sin(x+phase) for x in xx]
ax.plot(xx,F,color='b',marker=mk,label=labeltext)
labeltext='Cosine' + '*' + str(phase)
F=[np.cos(x+phase) for x in xx]
ax.plot(xx,F,color='g',marker=mk,label=labeltext)
hand, labl = ax.get_legend_handles_labels()
#hand, labl = function_to_split(hand,labl,'*')
ax.legend(hand,labl)
plt.savefig('Figure.png')
Run Code Online (Sandbox Code Playgroud)
我想要的是function_to_split自动以这样的图例结尾:
[blue line] Sine
[green line] Cosine
[black square] 0
[black circle] 0.785
[black triangle] 1.57
Run Code Online (Sandbox Code Playgroud) 考虑一个表示节点编号的正则矩阵,如图所示:
我想列出图中表示的所有三角形。这将导致以下二维列表:[[0,1,4],[1,5,4],[1,2,5],[2,6,5],...,[11,15,14]]
假设矩阵的维度是 ( NrX Nc) (在这种情况下为 (4X4) ),我可以使用以下代码实现此结果:
def MakeFaces(Nr,Nc):
Nfaces=(Nr-1)*(Nc-1)*2
Faces=np.zeros((Nfaces,3),dtype=np.int32)
for r in range(Nr-1):
for c in range(Nc-1):
fi=(r*(Nc-1)+c)*2
l1=r*Nc+c
l2=l1+1
l3=l1+Nc
l4=l3+1
Faces[fi]=[l1,l2,l3]
Faces[fi+1]=[l2,l4,l3]
return Faces
Run Code Online (Sandbox Code Playgroud)
但是,双循环操作使这种方法非常缓慢。有没有办法以聪明的方式使用 numpy 来更快地做到这一点?
我试图让我的群图更容易以黑白方式阅读,并且对于色盲的人来说,通过让色调不仅影响颜色,还影响标记的另一个几何方面。
import seaborn as sns
import matplotlib.pyplot as plt
sns.set(style="whitegrid")
tips = sns.load_dataset("tips")
fig, ax = plt.subplots(1,1)
ax = sns.swarmplot(x="day", y="total_bill", hue="sex",data=tips,size=8,ax=ax)
plt.show()
Run Code Online (Sandbox Code Playgroud)
我想将熊猫数据框的两列绘制为按类别并排的箱形图。这与此处提出的问题不同:Grouped boxplot with seaborn,其中两列内部有列表。那里的解决方案对我不起作用。
import seaborn as sns
import pandas as pd
import matplotlib.pyplot as plt
df = pd.DataFrame(
[
[2, 4, "A"],
[4, 5, "C"],
[5, 4, "B"],
[10, 4.2, "A"],
[9, 3, "B"],
[3, 3, "C"]
], columns=['data1', 'data2', 'Categories'])
#Plotting by seaborn
fig, axs = plt.subplots(1, 1)
sns.boxplot(data=df,x="Categories",y='data1',ax=axs)
fig.show()
plt.waitforbuttonpress()
plt.close(fig)
Run Code Online (Sandbox Code Playgroud)
从PIL文档中:
PIL.ImageDraw.Draw.line(xy,fill = None,width = 0)
在xy列表中的坐标之间绘制一条线。
参数:
- xy –由[[x,y),(x,y),...]等2元组或[x,y,x,y,...]等数值组成的序列。
- fill –用于行的颜色。
- width –线宽,以像素为单位。请注意,线连接处理不当,因此宽的折线看起来不太好。
我正在寻找解决此问题的方法。对我来说,一个好的解决方案是使线由PIL.ImageDraw圆角的末端(capstylein TKinter)绘制。有对应的PIL.ImageDraw吗?
最小的工作示例:
from PIL import Image, ImageDraw
WHITE = (255, 255, 255)
BLUE = "#0000ff"
MyImage = Image.new('RGB', (600, 400), WHITE)
MyDraw = ImageDraw.Draw(MyImage)
MyDraw.line([100,100,150,200], width=40, fill=BLUE)
MyDraw.line([150,200,300,100], width=40, fill=BLUE)
MyDraw.line([300,100,500,300], width=40, fill=BLUE)
MyImage.show()
Run Code Online (Sandbox Code Playgroud)
MWE的结果:
python ×6
matplotlib ×2
seaborn ×2
legend ×1
mesh ×1
numpy ×1
pillow ×1
plot ×1
swarmplot ×1
triangular ×1