我想创建一个包含字符串域的比例:
var scale = d3.scaleXXX().domain(["A", "B", "C", "D", "E"]).range([0, width]);
为了拥有这个方法:
scale(domain: string): number
这样绘制线条这样的转换方法:
svgNode.append('line')
.attr('x1', (domain) => Math.round(scale(domain)))
.attr('y1', 0)
.attr('x2', (domain) => Math.round(scale(domain)))
.attr('y2', height);
我找不到好的比例类型和方法来设置域名,范围并获得正确的转换方法。
你可以帮帮我吗?
谢谢,
答案 0 :(得分:2)
在我看来(如果我错了,请纠正我),问题是没有"字符串" 域(无论它是什么),但是分类变量的域被映射到定量范围。
在这种情况下,适当的比例是point scale。根据文档,
与连续尺度不同,序数尺度具有离散域和范围[...]点尺度是带尺度的变体,带宽固定为零。点标度通常用于具有序数或分类维度的散点图。
这是一个基于你的代码片段的演示:
import requests
import pandas as pd
import re
url = ("http://api.worldbank.org/v2/countries?format=xml")
r = requests.get(url)
with open(('testcase.xml'), 'w') as f:
f.write(r.text)
test = r.text
# Parse through string and capture ISO and name
country_iso = re.findall(r"iso2Code>(.*)</wb:iso2Code",test)
country_name = re.findall(r"name>(.*)</wb:name",test)
# store in pandas dataframes, then concatenate them into one
country_iso_df = pd.DataFrame(country_iso, columns=['ISO'])
country_name_df = pd.DataFrame(country_name, columns=['Name'])
output_df = pd.concat([country_iso_df, country_name_df], axis=1)
# print then output to csv
output_df
output_df.to_csv("insert path here")
&#13;
var svg = d3.select("svg");
var data = ["A", "B", "C", "D", "E"];
var color = d3.scaleOrdinal(d3.schemeCategory10)
var scale = d3.scalePoint()
.domain(data)
.range([20, 280]);
var lines = svg.selectAll(null)
.data(data)
.enter()
.append("line")
.attr("y1", 0)
.attr("y2", 120)
.attr("x1", d => scale(d))
.attr("x2", d => scale(d))
.style("stroke", d => color(d))
.style("stroke-width", 2);
var axis = d3.axisBottom(scale)(svg.append("g").attr("transform", "translate(0,130)"))
&#13;