如何解决设置 Altair 中单个点标记的大小
我一直在尝试弄清楚如何在 altair 中设置单个点的大小,但无法完全破解。在 matplotlib 中很容易做到,但我正在尝试自学 altair 的所有东西,但被难住了。以下是我在 matplotlib 中的做法以及我在 altair 中的最佳尝试:
import numpy as np
import pandas as pd
import random
import matplotlib.pyplot as plt
import altair as alt
def generate_data(x,y):
data = pd.DataFrame(
columns = ['x','y','point_size'],data = {
'x': pd.Series(np.tile(range(1,x+1),y) ),'y': np.repeat(range(1,y),'point_size': [random.randint(0,3) for i in range(0,x*y)],},)
return data
def plot_points(data):
fig = data.plot(
kind='scatter',x='x',y='y',marker='.',s = data['point_size']*50,# setting the size factor
)
def plot_points_altair(data):
fig = alt.Chart(data[data.point_size>0]).mark_point(filled=True).encode(
x=alt.X('x'),y=alt.Y('y'),size=alt.strokeWidth('point_size:N'),)
return fig
data = generate_data(10,10)
plot_points(data)
plot_points_altair(data)
我过滤掉零值以避免绘制它们,但 altair 将我的点大小视为分类,我想控制每个点的实际点大小,好吧,点(或像素或派卡或其他你)。
解决方法
您可以通过使用带有 size
的 scale=None
编码来实现:这将告诉 Altair 使用原始数据来控制指定编码的值,而不是隐式生成数据之间的映射域和视觉域:
import numpy as np
import pandas as pd
import random
import altair as alt
def generate_data(x,y):
data = pd.DataFrame(
columns = ['x','y','point_size'],data = {
'x': pd.Series(np.tile(range(1,x+1),y) ),'y': np.repeat(range(1,y),'point_size': [50 * random.randint(0,3) for i in range(0,x*y)],},)
return data
def plot_points_altair(data):
fig = alt.Chart(data[data.point_size>0]).mark_point(filled=True).encode(
x=alt.X('x'),y=alt.Y('y'),size=alt.Size('point_size:N',scale=None),)
return fig
data = generate_data(10,10)
plot_points_altair(data)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。